Android應(yīng)用界面開發(fā)
第三章學(xué)習(xí)
第一部分####
1.繼承View類來實(shí)現(xiàn)自定義控件####
自定義控件的三種創(chuàng)建形式:
- 通過繼承一個(gè)布局文件實(shí)現(xiàn)自定義控件。
- 繼承已有的控件來實(shí)現(xiàn)自定義控件。
- 通過繼承View類來實(shí)現(xiàn)自定義控件。
自定義控件是個(gè)大坑,并不能在此以偏概全闡述出它的精髓,筆記僅作為一方面的了解作用。
1.1 通過繼承一個(gè)布局文件實(shí)現(xiàn)自定義控件
知識要點(diǎn)
關(guān)于dp、sp、dpi、px、density
dp:density-independent pixel,密度(屏幕分辨率)無關(guān)像素,非文字的類尺寸推薦用dp
sp:scale-independent pixel ,規(guī)模無關(guān)像素,文字類尺寸推薦用sp
px:像素,一般不用,偶爾用1px表示一條線
pdi:dots per inch:一英寸多少個(gè)像素點(diǎn),常見取值 120,160,240
density:密度,和標(biāo)準(zhǔn)dpi的比例(160px/inc)
提取布局的屬性:theme & style ---- 配置 "樣式"
theme:在manifest.xml中,可用android:theme="@style/AppTheme"屬性,替application(整個(gè)應(yīng)用)添加統(tǒng)一的主題,默認(rèn)主題保存在styles.xml中
style:通過添加item,可以將通用的屬性提取出來,填在此處,避免每一個(gè)新建的部件都重復(fù)填寫同一屬性,如果仍然填寫,則覆蓋style中同名的屬性;style的部署,主要放在values.xml中,而使用時(shí),在view類中添加style=""屬性進(jìn)行配置
<!--配置style-->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--使用style-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView"
style="@style/TextAppearance.AppCompat.Title"/>
只要布局好一個(gè)xml文件,在需要使用的時(shí)候,僅一句include即可
<include layout="@layout/my_title"/>
可是這種自定義控件,自身沒有響應(yīng)點(diǎn)擊等邏輯,需要時(shí)只有每次實(shí)例化控件,編寫java代碼來實(shí)現(xiàn),沒有復(fù)用性,于是有了下面這種更進(jìn)階的方式。
1.2 通過繼承View類來實(shí)現(xiàn)自定義控件
知識要點(diǎn)
- LayoutInflater
- 獲得View對象: 一般在活動中,要獲取mxl中的控件是使用findViewById( )方法,而獲取整個(gè)xml文件就需要用到LayoutInflater了
- LayoutInflater:布局填充器,可使用inflate( )方法將xml布局文件轉(zhuǎn)化為View對象,獲得LayoutInflater對象有三種方式
- inflate(int resource, ViewGroup root ):第一個(gè)參數(shù)是要加載的布局文件的id,第二個(gè)參數(shù)是給加載好的布局再添加一個(gè)父布局
眼見為實(shí),操作如下:
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//先獲得LayoutInflater實(shí)例
LayoutInflater mLayoutInflater =
getLayoutInflater(); //方法一
getSystemService(LAYOUT_INFLATER_SERVICE); //方法二
LayoutInflater.from(context); //方法三
//通過inflate()解析布局文件xml
View view = mLayoutInflater.inflate(R.layout.my_title,null);
TextView textview = (TextView)view.findViewById(R.id.textview);
}
}
通過在構(gòu)造方法中獲取自定義部件來實(shí)現(xiàn)代碼邏輯,完成了一種通用的可相應(yīng)事件的自定義部件。
還可以重載onDraw()方法,對自定義控件進(jìn)行繪制,比如:
以后學(xué)完SurfaceView,還可以制作不使用布局文件,僅繼承自View或其子類來實(shí)現(xiàn)自定義控件,比如游戲。
上次跟著教程只做過一個(gè)游戲,感興趣可以在github下載代碼來看:github