日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android 用户界面---定制组件(Custom Components)

發(fā)布時(shí)間:2025/7/14 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 用户界面---定制组件(Custom Components) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于布局類(lèi)View和ViewGroup的基本功能,Android為創(chuàng)建自己的UI界面提供了先進(jìn)和強(qiáng)大的定制化模式。首先,平臺(tái)包含了各種預(yù)置的View和ViewGroup子類(lèi)---Widget和layout,可以使用它們來(lái)構(gòu)造自己的UI界面。

部分的可以利用的widget包括:Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner、以及比較特殊用途的AutoCompleteTextView、ImageSwitcher和TextSwitcher。

其中可利用的布局是:LinearLayout、FrameLayout、RelativeLayout以及其他的布局。更多的例子請(qǐng)看“共通布局對(duì)象”。http://developer.android.com/guide/topics/ui/layout-objects.html

如果遇到了沒(méi)有預(yù)置的widget或layout的需求,可以創(chuàng)建自己的View子類(lèi)。如果只需要對(duì)既存的widget或layout進(jìn)行小的調(diào)整,那么只需簡(jiǎn)單的繼承widget或layout,并且重寫(xiě)它們的方法。

創(chuàng)建自己的View子類(lèi),以便能夠精準(zhǔn)的控制屏幕元素的外觀和功能。以下是用定制View對(duì)象來(lái)實(shí)現(xiàn)這種控制想法的一些例子:

1.??創(chuàng)建一個(gè)完全的定制化渲染的View類(lèi)型,如用類(lèi)似模擬電子控制的2D圖形來(lái)渲染的音量控制按鈕。

2.??把一組View組件組合成一個(gè)新的單一組件,制作一些像ComboBox(一個(gè)下拉列表和文本輸入域的組合)、雙面板選擇器(左右兩個(gè)列表面板,右邊的列表面板中的項(xiàng)目與左邊列表面板中的一個(gè)項(xiàng)目相關(guān)聯(lián))等組件。

3.??重寫(xiě)一個(gè)EditText組件在屏幕上的渲染的方法。

4.??捕獲一些像按鍵一樣的事件,并在某些定制的方法中處理它們(如游戲)。

基本方法

以下是創(chuàng)建自定義View組件需要要了解基本概要:

1.??自定義的View類(lèi)要繼承一個(gè)既存的View類(lèi)或其子類(lèi);

2.??在子類(lèi)重寫(xiě)父類(lèi)的一些方法。要覆寫(xiě)的父類(lèi)方法是用‘on’開(kāi)頭的,例如,onDraw()、onMeasure()和onKeyDown()等,這有點(diǎn)類(lèi)似于重寫(xiě)Activity或ListActivity的生存周期回調(diào)的on…事件。

3.??使用新的擴(kuò)展類(lèi),一旦完成,新擴(kuò)展的類(lèi)就能被用于替換基本的View對(duì)象。

提示:擴(kuò)展類(lèi)能夠作為使用它們的Acticity的內(nèi)部類(lèi)來(lái)定義。這樣對(duì)控制對(duì)它們的訪問(wèn)是有益的,當(dāng)然可以創(chuàng)建一個(gè)新的公共的View類(lèi),這樣就可以在應(yīng)用程序范圍內(nèi)來(lái)使用。

完全定制化的組件

完全定制化的組件能夠用于創(chuàng)建你所期望的顯示效果的圖形化組件??梢允强瓷先ハ衽f的模擬儀表的圖形化VU儀表,或者是一個(gè)長(zhǎng)的歌詞視圖,有一個(gè)跳動(dòng)的球沿著歌詞移動(dòng),以便跟著這卡拉OK機(jī)歌唱,這兩種情況,無(wú)論如何組織內(nèi)置的組件都無(wú)法滿足要求。

幸運(yùn)的是,能夠使用任意自己喜歡的方法來(lái)創(chuàng)建組件的外觀和行為,唯一的限制就是你的想象力、屏幕的尺寸和可利用的處理能力(因?yàn)閼?yīng)用程序最終可能運(yùn)行在比桌面工作站處理能力要弱的設(shè)備上)。

以下是創(chuàng)建完全定制組件的步驟:

1.??毋庸置疑,能夠擴(kuò)展的最通用的視圖是View類(lèi),因此通常是繼承這個(gè)View類(lèi)來(lái)創(chuàng)建自己的新的組件;

2.??提供一個(gè)能夠從XML中獲取屬性和參數(shù)的構(gòu)造器,并且也能夠使用自己屬性和參數(shù)(如VU儀表的顏色和范圍,指針的寬度和阻尼等);

3.??創(chuàng)建組件中可能的事件監(jiān)聽(tīng)器、屬性訪問(wèn)器和修飾符以及盡可能準(zhǔn)確的行為等;

4.??覆寫(xiě)onMeasure()回調(diào)方法,如果想要組件顯示一些東西,也要覆寫(xiě)onDraw()回調(diào)。雖然它們都有默認(rèn)的行為,onDraw()回調(diào)默認(rèn)什么也不做,onMeasure()方法默認(rèn)的要設(shè)置組件的尺寸為100x100;

5.??覆寫(xiě)其他的需要on…方法。

擴(kuò)展onDraw()和onMeasure()

onDraw()方法會(huì)把能夠?qū)崿F(xiàn)的任何想要的東西放到一個(gè)Canvas對(duì)象上,如2D圖形、標(biāo)準(zhǔn)或定制的組件、樣式化的文本、或其他任何能夠想到的東西。

注意:View類(lèi)不能使用3D圖形。如果要使用3D圖形,必須繼承SurfaceView類(lèi),而不是View類(lèi),并且要在一個(gè)獨(dú)立的線程中描畫(huà)。

onMeasure()方法有點(diǎn)復(fù)雜,它是組件和它的容器之間的渲染約束的關(guān)鍵部分。覆寫(xiě)onMeasure(),以便準(zhǔn)確高效的報(bào)告組件被包含部分的尺寸。由于來(lái)自父容器限制的要求,使得尺寸的測(cè)量有些復(fù)雜,并且組件的尺寸一旦被計(jì)算完成,就要調(diào)用setMeasureDimension()方法來(lái)保存測(cè)量的寬度和高度。如果在onMeasure()方法中調(diào)用setMeasureDimension()方法失敗,這個(gè)結(jié)果在測(cè)量時(shí)將是一個(gè)異常的值。

在上層看,實(shí)現(xiàn)onMeasure()方法的步驟如下:

1.??要用父容器的寬度和高度的計(jì)量規(guī)格來(lái)調(diào)用被覆寫(xiě)的onMensure()方法(widthMeasureSpec和heightMeasureSpec參數(shù)都是代表了尺寸的整數(shù)),這兩個(gè)參數(shù)應(yīng)該作為生成組件的寬度和高度的約束要求。對(duì)于這些規(guī)格約束類(lèi)型的完整說(shuō)明可以在View類(lèi)說(shuō)明的View.onMeasure(int,int)方法中找到。

2.??組件的onMeasure()方法應(yīng)該計(jì)算用于渲染組件所需的尺寸(寬度和高度)。組件應(yīng)該盡量保留在被傳入的規(guī)格范圍內(nèi),盡管它能夠選擇超出規(guī)格范圍(在這種情況下,父容器能夠選擇做的事情包括:裁剪、滾動(dòng)、拋出異常、或者要求onMeasure()方法用不同的尺寸規(guī)格再試)。

3.??一旦組件的寬度和高度被計(jì)算完成,就必須調(diào)用setMeasuredDimension(int width, int height)方法來(lái)保存計(jì)算結(jié)果。不這樣做就會(huì)拋出一個(gè)異常。

下表是framework調(diào)用View類(lèi)的其他標(biāo)準(zhǔn)方法:

分類(lèi)

方法

說(shuō)明

Creation

Constructors

構(gòu)造器的調(diào)用有兩種類(lèi)型:1.在代碼中創(chuàng)建View對(duì)象;2.用布局文件填充View對(duì)象。第二種類(lèi)型應(yīng)該解析和應(yīng)用布局文件中的任何屬性定義。

onFinishInflate()

View對(duì)象和它的所有子對(duì)象都用XML填充完之后,調(diào)用這個(gè)方法。

Layout

onMeasure(int, int)

調(diào)用這個(gè)方法決定View對(duì)象及其所有子對(duì)象的尺寸要求。

onLayout(boolean,int,int,int,int)

當(dāng)View對(duì)象給它的所有子對(duì)象分配尺寸和位置時(shí),調(diào)用這個(gè)方法。

onSizeChanged(int,int,int,int)

當(dāng)View對(duì)象的尺寸發(fā)生改變時(shí),調(diào)用這個(gè)方法。

Drawing

onDraw(Canvas)

當(dāng)View對(duì)象渲染它的內(nèi)容時(shí),調(diào)用這個(gè)方法。

Event

onKeyDown(int,KeyEvent)

當(dāng)一個(gè)鍵的按下事件發(fā)生時(shí),調(diào)用這個(gè)方法

onKeyUp(int,KeyEvent)

當(dāng)一個(gè)鍵彈起事件發(fā)生時(shí),調(diào)用這個(gè)方法

onTrackballEvent(MotionEvent)

當(dāng)鼠標(biāo)軌跡球滾動(dòng)事件發(fā)生時(shí),調(diào)用這個(gè)方法。

onTouchEvent(MotionEvent)

當(dāng)觸屏事件發(fā)生時(shí),調(diào)用這個(gè)方法。

Focus

onFocusChanged(boolean,int,Rect)

當(dāng)View對(duì)象獲取或失去焦點(diǎn)時(shí),調(diào)用這個(gè)方法。

onWindowFocusChanged(boolean)

當(dāng)包含View對(duì)象的窗口獲得或失去焦點(diǎn)時(shí),調(diào)用這個(gè)方法。

Attaching

onAttachedToWindow()

當(dāng)View對(duì)象被綁定到一個(gè)窗口時(shí),調(diào)用這個(gè)方法。

onDetachedFromWindow()

當(dāng)View對(duì)象被從它的窗口中分離的時(shí)候,調(diào)用這個(gè)方法。

onWindowVisibilityChanged(int)

當(dāng)包含View對(duì)象的窗口的可見(jiàn)性發(fā)生改變時(shí),調(diào)用這個(gè)方法。

?

?

?

定制View的例子

API Demos中提供了一個(gè)定制的View對(duì)象的例子:CustomView。這個(gè)定制的View定義在LabelView類(lèi)中。

LabelView示例展示了很多定制組件的不同特征:

1.? 繼承View類(lèi)的完全定制化的組件;

2.??參數(shù)化的帶有View填充參數(shù)(在XML中定義的參數(shù))方式構(gòu)造View對(duì)象。有一些填充參數(shù)使用通過(guò)這個(gè)View的父類(lèi)傳遞過(guò)來(lái)的,還有一些用于labelView對(duì)象而定義的定制的屬性;

3.??你所期望看到的標(biāo)準(zhǔn)的公共類(lèi)型的方法,如setText()、setTextSize()、setTextColor()等等;

4.??一個(gè)重寫(xiě)的onMeasure()方法,它決定和設(shè)置了組件的渲染尺寸。(注意:在LabelView類(lèi)中,實(shí)際的工作是由一個(gè)私有的measureWidth()方法來(lái)做的。)

5.??一個(gè)重寫(xiě)的onDraw()方法,它在提供的Canvas上描畫(huà)標(biāo)簽。

從這個(gè)示例的custom_view_1.xml中,能夠看到一些LabelView定制View的用法。實(shí)際上,可以看到android:命名空間參數(shù)和定制的app:命名空間的組合。這些app:參數(shù)是LabelView類(lèi)所承認(rèn)的并用于工作的一些定制化的屬性,并且這些參數(shù)在示例的R資源定義類(lèi)的styleable內(nèi)部類(lèi)中被定義。

?

import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View;public class CrossView extends View {private float mRotation;private Paint mPaint;public CrossView( Context context, AttributeSet attrs ) {//AttributeSet對(duì)象在實(shí)例化時(shí)被系統(tǒng)傳給了視圖super( context, attrs );//start 創(chuàng)建paint對(duì)象mPaint = new Paint();mPaint.setAntiAlias( true );mPaint.setColor( 0xFFFFFFFF );//end 創(chuàng)建paint對(duì)象//使用obtainStyledAttributes方法來(lái)創(chuàng)建一個(gè)TypedArray,這是訪問(wèn)存儲(chǔ)于AttributeSet中的值的一個(gè)方便類(lèi),這類(lèi)執(zhí)行內(nèi)部緩存,//所以當(dāng)你結(jié)束使用它之后隨時(shí)調(diào)用回收函數(shù)。注意:需同時(shí)使用<declare-styleable>名稱(chēng)和<arr>名稱(chēng)的訪問(wèn)自定義屬性TypedArray arr = getContext().obtainStyledAttributes( attrs,R.styleable.cross );int color = arr.getColor( R.styleable.cross_android_color, Color.WHITE );float rotation = arr.getFloat( R.styleable.cross_rotation, 0f );//remember to call this when finishedarr.recycle();setColor(color);setRotation(rotation);}private void setRotation( float rotation ) {// TODO Auto-generated method stubmRotation = rotation;}private void setColor( int color ) {// TODO Auto-generated method stubmPaint.setColor( color );}//重寫(xiě)onMeasure方法@Overrideprotected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) {// TODO Auto-generated method stubsuper.onMeasure( widthMeasureSpec, heightMeasureSpec );//需要使用計(jì)算好的寬和高的值作為該方法的實(shí)參setMeasuredDimension( calculateMeasure(widthMeasureSpec), calculateMeasure(heightMeasureSpec) );}float[] mPoints = {0.5f,0f,0.5f,1f,0f,0.5f,1f,0.5f};@Overrideprotected void onDraw( Canvas canvas ) {// TODO Auto-generated method stubsuper.onDraw( canvas );canvas.save();//所有的在畫(huà)布上繪圖的調(diào)用都應(yīng)當(dāng)受對(duì)應(yīng)的sava()和restore()的約束int scale = getWidth();canvas.scale( scale, scale );canvas.rotate( mRotation );canvas.drawLines( mPoints, mPaint );//繪制十字的兩條線canvas.restore();//所有的在畫(huà)布上繪圖的調(diào)用都應(yīng)當(dāng)受對(duì)應(yīng)的sava()和restore()的約束}private static final int DEFAULT_SIZE = 100;//默認(rèn)的試圖尺寸//實(shí)現(xiàn)計(jì)算測(cè)量值的代碼private int calculateMeasure(int measureSpec){int result = ( int ) ( DEFAULT_SIZE*getResources().getDisplayMetrics().density );int specMode = MeasureSpec.getMode( measureSpec );//在MeasureSpec中檢索模式int specSize = MeasureSpec.getSize( measureSpec );//在MeasureSpec中檢索尺寸//基于模式選擇尺寸if(specMode == MeasureSpec.EXACTLY){result = specSize;}else if(specMode == MeasureSpec.AT_MOST){result = Math.min( result, specSize );}return result;} } (二)自定義屬性<?xml version="1.0" encoding="utf-8"?> <!-- 該文件被放置在res/values/目錄下 --> <resources><!-- 聲明屬性 --><declare-styleable name="cross"><attr name="android:color"/><attr name="rotation" format="string"/></declare-styleable><!-- <attr name="test" format="string"/><declare-styleable name="foo"><attr name="test"/></declare-styleable><declare-styleable name="bar"><attr name="test"/></declare-styleable> --> </resources> (三)在XML中使用自定義View <?xml version="1.0" encoding="utf-8"?><!-- 要使用在XML中的自定義屬性,首先必須為視圖聲明命名空間 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:example="http://schemas.android.com/apk/res/com.example"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><!-- 添加CrossView --><com.example.CrossViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"/><com.example.CrossViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"example.rotation="30" android:color="#0000FF"/>/><com.example.CrossViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"example.rotation="40" android:color="#FFFF00"/> </LinearLayout>

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/wxishang1991/p/android.html

總結(jié)

以上是生活随笔為你收集整理的Android 用户界面---定制组件(Custom Components)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 去毛片 | 欧洲av无码放荡人妇网站 | 海角社区在线视频播放观看 | 四虎免费视频 | 在线看黄色网址 | 五月婷婷久| 一区二区三区韩国 | 香蕉精品视频在线观看 | 影音先锋在线看片资源 | 日本高清视频免费看 | xxxx毛片| 91成人动漫| 国产一区二区三区视频网站 | 日出白浆视频 | 国产精品高潮呻吟久久久久久 | 中文字幕在线观看国产 | 亚洲国产精品久久人人爱 | 毛片aa | 欧美一区网站 | 亚洲中文字幕无码一区 | 国产深夜福利在线 | 日本午夜电影 | 密乳av| 岛国精品资源网站 | 国产a免费视频 | 久久国产热 | 东方成人av | 91av免费看 | 一区二区成人在线观看 | 肥臀熟女一区二区三区 | 欧美黄色小说 | 91娇羞白丝网站 | 欧美视频免费看欧美视频 | 69久人妻无码精品一区 | 亚洲精品尤物 | 久久成人免费视频 | 日韩一区二区三区视频 | 一区二区三区在线视频播放 | 懂色av一区二区三区免费观看 | 午夜动态图 | 黄色小视频免费在线观看 | 午夜亚洲福利在线老司机 | 国产91在线精品 | 国产高潮又爽又无遮挡又免费 | 巨乳在线播放 | 韩国短剧在线观看 | 国产又黄又湿 | 性一交一乱一透一a级 | 美国特色黄a大片 | 久草影视网 | 浪浪视频在线观看 | www.欧美com| 国产色网| 日韩视频免费观看 | 天天想你在线观看完整版电影免费 | 奇米在线 | 免费无码一区二区三区 | 日韩欧美精品在线观看 | 波多野结衣黄色 | 一本一道无码中文字幕精品热 | 成人在线观看你懂的 | av片免费播放 | 草久久免费视频 | 欧美丰满熟妇xxxxx | 吸咬奶头狂揉60分钟视频 | 国产日韩欧美中文 | 亚洲人成人一区二区在线观看 | 中文字幕 自拍 | 亚洲一区二区中文 | 亚洲天堂不卡 | 国产第六页 | 少妇精品无码一区二区免费视频 | 少妇一夜三次一区二区 | 性高潮在线观看 | 亚洲无码一区二区三区 | 国产91在线看 | 伊在线久久丫 | www.综合色| 日韩在线视频网址 | 精品国产aⅴ一区二区三区四川人 | 国产精品国产三级国产Av车上的 | 自拍视频啪| 欧美激情亚洲激情 | 91久久亚洲 | 午夜寂寞院 | 69视频免费在线观看 | 成人在线黄色 | 日本色中色 | 天堂网8 | 久久久久久久网站 | 成人激情开心 | jizz日本免费 | 黄色网址进入 | 亚洲图片在线播放 | 抽插丰满内射高潮视频 | 狠狠97 | 97狠狠操| 可以直接看的无码av | 亚洲一区二区国产 |