大家好,我是程序員雙木L,后續(xù)會發(fā)專題類的文章,這是自定義控件的第一篇,之后也會陸續(xù)更新相關(guān)的文章,歡迎關(guān)注。
在清苑等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站制作,清苑網(wǎng)站建設(shè)費(fèi)用合理。
自定義屬性在自定義控件過程中屬于比較常見的操作,我們可以回想一下這樣的場景:自定義view的過程中,我們需要在不同的情況下設(shè)置不同的文字大小,那么我們是不是就需要提供對外的方法來設(shè)置,這樣就比較靈活操作。而我們自定義對外的方法,就是我們自定義的屬性啦,那我們來分析一下其原理及作用。
下面我們根據(jù)例子來進(jìn)行分析:
1、首先我們需要在res-values目錄下新建attrs.xml文件,該文件就是用來聲明屬性名及其接受的數(shù)據(jù)格式的,如下:
attr名詞解析:
name表示屬性名,上面的屬性名是我自己定義的。
format表示接受的輸入格式,format格式集合如下:
2、自定義屬性的使用,這里我們使用兩種方式進(jìn)行對比解析
最最最原始的使用方式
(1)、自定義文件如下:
我們可以在TestAttrsView方法的參數(shù)AttributeSet是個(gè)xml解析工具類,幫助我們從布局的xml里提取屬性名和屬性值。
(2)、在布局文件xml中的使用
這里使用自定義屬性需要聲明xml的命名空間,其中app是命名空間,用來加在自定義屬性前面。
xmlns:app=" "
聲明xml命名空間,xmlns意思為“xml namespace”.冒號后面是給這個(gè)引用起的別名。
schemas是xml文檔的兩種約束文件其中的一種,規(guī)定了xml中有哪些元素(標(biāo)簽)、
元素有哪些屬性及各元素的關(guān)系,當(dāng)然從面向?qū)ο蟮慕嵌壤斫鈙chemas文件可以
認(rèn)為它是被約束的xml文檔的“類”或稱為“模板”。
(3)、將屬性名與屬性值打印結(jié)果如下:
從打印結(jié)果我們可以看出,AttributeSet將布局文件xml下的屬性全部打印出來了,細(xì)心的童鞋可能已經(jīng)看出來:
這個(gè)屬性我們設(shè)置的是一個(gè)整數(shù)尺寸,可最后打印出來的是資源編號。
那如果我們想要輸出我們設(shè)置的整數(shù)尺寸,需要怎么操作呢?
這個(gè)時(shí)候就該我們這篇的主角出場了,使用TypedArray方式。
(1)、這里我們需要將attrs.xml使用“declare-styleable”標(biāo)簽進(jìn)行改造,如下:
從改造后的attrs文件可以看出,我們將屬性聲明歸結(jié)到TestStyleable里面,也就意味著這些屬性是屬于TestStyleable下的。
(2)、屬性的解析:
這里我直接打印出解析結(jié)果,這里可以獲取我們想要的自定義屬性,而系統(tǒng)有的屬性可以忽略。
(3)、運(yùn)行結(jié)果如下
從解析的結(jié)果可以看出,尺寸的結(jié)果已經(jīng)轉(zhuǎn)換為實(shí)際值了:
這個(gè)時(shí)候有童鞋又問了,我設(shè)置的是15dp,為啥最后打印是41.25了呢?其實(shí)解析出來的值單位是px,所以這里輸出的是轉(zhuǎn)換后的值。
解析的過程中用到了這個(gè)方法:
我們來看一下這個(gè)方法的源碼:
源碼中我們可以看到這個(gè)方法有兩個(gè)參數(shù):
obtainStyledAttributes方法返回值類型為TypedArray。該類型記錄了獲取到的屬性值集合,而通過數(shù)組下標(biāo)索引即可找到對應(yīng)的屬性值。索引下標(biāo)通過R.styleable.TestStyleable_xx獲取,"xx"表示屬性名,一般命名為"styleable名" + "_" + "屬性名"。
而TypedArray提供了各種Api,如getInteger,getString,getDimension等方法來獲取屬性值,這些方法都需要傳入對應(yīng)屬性名在obtainStyledAttributes中的int數(shù)組的位置索引,通過下標(biāo)獲取數(shù)組里屬性值。
這個(gè)TypedArray的作用就是資源的映射作用,把自定義屬性在xml設(shè)置值映射到class,這樣怎么獲取都很簡單啦。
到這里就分析完啦!
Android布局控件之LinearLayout詳解
LinearLayout是線性布局控件,它包含的子控件將以橫向或豎向的方式排列,按照相對位置來排列所有的widgets或者其他的containers,超過邊界時(shí),某些控件將缺失或消失。因此一個(gè)垂直列表的每一行只會有一個(gè)widget或者是container,而不管他們有多寬,而一個(gè)水平列表將會只有一個(gè)行高(高度為最高子控件的高度加上邊框高度)。LinearLayout保持其所包含的widget或者是container之間的間隔以及互相對齊(相對一個(gè)控件的右對齊、中間對齊或者左對齊)。
xml屬性
android:baselineAligned:是否允許用戶調(diào)整它內(nèi)容的基線。
android:baselineAlignedChildIndex:當(dāng)一個(gè)線性布局與另一個(gè)布局是按基線對齊的一部分,它可以指定其內(nèi)容的基線對齊方式。
android:gravity:指定如何在該對象中放置此對象的內(nèi)容(x/y坐標(biāo)值)。
android:orientation:設(shè)置它內(nèi)容的對其方向(橫向/豎向)。
gravity 這個(gè)英文單詞是重心的意思,在這里就表示??课恢玫囊馑?。
android:layout_gravity 和 android:gravity 的區(qū)別
從名字上可以看到,android:gravity是對元素本身說的,元素本身的文本顯示在什么地方靠著換個(gè)屬性設(shè)置,不過不設(shè)置默認(rèn)是在左側(cè)的。
android:layout_gravity是相對與它的父元素說的,說明元素顯示在父元素的什么位置。
比如說button:android:layout_gravity 表示按鈕在界面上的位置。 android:gravity表示button上的字在button上的位置。
可選值
這兩個(gè)屬性可選的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical。
而且這些屬性是可以多選的,用“|”分開。
默認(rèn)這個(gè)的值是:Gravity.LEFT
LinearLayout還支持為其包含的widget或者是container指定填充權(quán)值。好處就是允許其包含的widget或者是container可以填充屏幕上的剩余空間。這也避免了在一個(gè)大屏幕中,一串widgets或者是containers擠成一堆的情況,而是允許他們放大填充空白。剩余的空間會按這些widgets或者是containers指定的權(quán)值比例分配屏幕。默認(rèn)的 weight 值為0,表示按照widgets或者是containers實(shí)際大小來顯示,若高于0的值,則將Container剩余可用空間分割,分割大小具體取決于每一個(gè)widget或者是container的layout_weight及該權(quán)值在所有widgets或者是containers中的比例。例如,如果有三個(gè)文本框,其中兩個(gè)指定的權(quán)值為1,那么,這兩個(gè)文本框?qū)⒌缺壤胤糯螅⑻顫M剩余的空間,而第三個(gè)文本框不會放大,按實(shí)際大小來顯示。如果前兩個(gè)文本框的取值一個(gè)為2,一個(gè)為1,顯示第三個(gè)文本框后剩余的空間的2/3給權(quán)值為2的,1/3大小給權(quán)值為1的。也就是權(quán)值越大,重要度越大。
如果LinearLayout包含子LinearLayout,子LinearLayout之間的權(quán)值越大的,重要度則越小。如果有LinearLayout A包含LinearLayout C,D,C的權(quán)值為2,D的權(quán)值為1,則屏幕的2/3空間分給權(quán)值為1的D,1/3分給權(quán)值為2的C。在LinearLayout嵌套的情況下,子LinearLayout必須要設(shè)置權(quán)值,否則默認(rèn)的情況是未設(shè)置權(quán)值的子LinearLayout占據(jù)整個(gè)屏幕
表格布局,適用于多行多列的布局格式,每個(gè)TableLayout是由多個(gè) TableRow 組成,一個(gè) TableRow 就表示 TableLayout 中的每一行,這一行可以由多個(gè)子元素組成。實(shí)際上 TableLayout 和 TableRow 都是 LineLayout 線性布局的子類。但是 TableRow 的參數(shù) android?rientation 屬性值固定為 horizontal ,且 android:layout_width=MATCH_PARENT , android:layout_height=WRAP_CONTENT 。所以 TableRow 實(shí)際是一個(gè)橫向的線性布局,且所以子元素寬度和高度一致。
注意: 在 TableLayout 中,單元格可以為空,但是不能跨列,意思是只能不能有相鄰的單元格為空.
在 TableLayout 布局中,一列的寬度由該列中最寬的那個(gè)單元格指定,而該表格的寬度由父容器指定??梢詾槊恳涣性O(shè)置以下屬性:
RelativeLayout 繼承于 android.widget.ViewGroup ,其按照子元素之間的位置關(guān)系完成布局的,作為 Android 系統(tǒng)五大布局中最靈活也是最常用的一種布局方式,非常適合于一些比較復(fù)雜的界面設(shè)計(jì)。
注意:在引用其他子元素之前,引用的 ID 必須已經(jīng)存在,否則將出現(xiàn)異常。
將所有的子元素放在整個(gè)界面的左上角,后面的子元素直接覆蓋前面的子元素,所以用的比較少。
絕對布局中將所有的子元素通過設(shè)置 android:layout_x 和 android:layout_y 屬性,將子元素的坐標(biāo)位置固定下來,即坐標(biāo)( android:layout_x , android:layout_y ) , layout_x 用來表示橫坐標(biāo), layout_y 用來表示縱坐標(biāo)。 屏幕左上角為坐標(biāo)(0,0),橫向往右為正方,縱向往下為正方。實(shí)際應(yīng)用中,這種布局用的比較少,因?yàn)?Android 終端一般機(jī)型比較多,各自的屏幕大小。分辨率等可能都不一樣,如果用絕對布局,可能導(dǎo)致在有的終端上顯示不全等。
常見的有線性布局和相對布局,幀布局和表格布局很少用
布局的基本屬性有高度,寬度,和方向
概述:記錄一下常見布局的編寫方式。
答:使用recyclerView的網(wǎng)格布局即可。
答:使用別人的開源組件。
應(yīng)用場景,b站視頻的標(biāo)簽,商品標(biāo)簽等等。
答:使用LinearLayout布局,設(shè)置weightSum屬性,子view設(shè)置layout_weight屬性。記住需要把設(shè)定的寬度或者高度設(shè)置0dp。
答:使用RelativeLayout布局,最后一個(gè)子View會顯示在屏幕的最上方,不會被遮擋,常用來做activity標(biāo)題頭(titlebar)。
答:使用如下屬性即可。
答:推薦使用NestedScrllView。
答:參考:
答:如下
在布局中添加如下屬性
待補(bǔ)充。。。