android屬性詳解
① android布局屬性詳解
表格布局,適用於多行多列的布局格式,每個TableLayout是由多個 TableRow 組成,一個 TableRow 就表示 TableLayout 中的每一行,這一行可以由多個子元素組成。實際消態上 TableLayout 和 TableRow 都是 LineLayout 線性布局的子類。但是 TableRow 的參數 android rientation 屬性值固定為 horizontal ,且 android:layout_width=MATCH_PARENT , android:layout_height=WRAP_CONTENT 。所以 TableRow 實際是鏈橋蘆一個橫向的線性布局,且所以子元素寬度和高度一致。
注意: 在 TableLayout 中,單元格可以為空,但是不能跨列,意思是只能不能有相鄰的單元格為空.
在 TableLayout 布局中,一列的寬度由該列中最寬的那個單元格指定,而該表格的寬度由父容器指定。可以為每一列設置以下屬性:
RelativeLayout 繼承於 android.widget.ViewGroup ,其按照子元素之間的位置關系完成布局的,作為 Android 系統五大布局中最靈活也是最常用的一種布局方式,非常適合於一些比較復雜的界面設計。
注意:在引用其他子元素之前,引用的 ID 必須已經存在,否則將出現異常。
將所有的子元素放在整個界面的左上角,後面的子元素直接覆蓋前面的子元素,所以用的比較少。
絕對布局中將所有的子元素通過設置 android:layout_x 和 android:layout_y 屬性,將子元素的坐標位置固定下來,即坐標( android:layout_x , android:layout_y ) , layout_x 用來表示橫坐標, layout_y 用來表示縱坐標。 屏幕左上角為坐標(0,0),橫嚮往右為正方,縱嚮往下為正方。實際應用中,這種布局用的比較少,因為 Android 終端一般機型比較多,各棚帶自的屏幕大小。解析度等可能都不一樣,如果用絕對布局,可能導致在有的終端上顯示不全等。
② Android開發自定義屬性
掌握Android開發中最基礎的自定義屬性方法,自定義:PageController屬性,裡面含有:mPadding屬性,resourceID屬性,numberOfPagese屬性
1、自定義屬性:
(1)、創建一個values資源文件
(2)、使用declare-styleable關鍵字修飾
(3)、name值滑灶為自己定義正拍的類的類型
(4)、添加屬性 attr name 和對應值的類型 format(如果有多信清扮個類型用 | 隔開) (自定義屬性在xml中使用)
自定義屬性:
調用屬性:
2、創建PageController類繼承於LinearLayout,實現三個PageController方法
(1)創建私有變數:numberOfPage,resourceID,padding ,currentPage
(2)調用setNumberOfPage方法
(3)調用onTouchEvent方法實現觸摸事件
(4)調用SetCurrentPage還原上一次的默認狀態
(5)定義介面監聽指示器改變事件,並實現拉伸動畫
自定義屬性主要就是在value裡面定義屬性,然後在xml配置文件中進行調用。
③ android屬性動畫詳解
在 Android 動畫中,總共有兩種類型的動畫View Animation(視圖動畫)和Property Animator(屬性動畫);其中
View Animation包括Tween Animation(補間動畫)和Frame Animation(逐幀動畫);
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直觀上,他們有如下三點不同:
1、引入時間不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才開始有Property Animation相關的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、動畫類的命名不同: View Animation中動畫類取名都叫XXXXAnimation,而在Property Animator中動畫類的取名則叫XXXXAnimator大家都知道逐幀動畫主要是用來實現動畫的,而補間動畫才能實現控制項的漸入漸出、移動、旋轉和縮放的;而Property Animator是在Android 3.0版本才引入的,之前是沒有的。
為什麼還要引入Property Animator呢?
1、為什麼引入Property Animator(屬性動畫)
我提出一個假設:請問大家,如何利用補間動畫來將一個控制項的背景色在一分鍾內從綠色變為紅色?這個效果想必沒辦法僅僅通過改變控制項的漸入漸出、移動、旋轉和縮放來實現吧,而這個效果是可以通過Property Animator完美實現的
**這就是第一個原因:Property Animator能實現補間動畫無法實現的功能 **大家都知道,補間動畫和逐幀動畫統稱為View Animation,也就是說這兩個動畫只能對派生自View的控制項實例起作用;而Property Animator則不同,從名字中可以看出屬性動畫,應該是作用於控制項屬性的!正因為屬性動畫能夠只針對控制項的某一個屬性來做動畫,所以也就造就了他能單獨改變控制項的某一個屬性的值!比如顏色!這就是Property Animator能實現補間動畫無法實現的功能的最重要原因。
**我們得到了第二點不同:View Animation僅能對指定的控制項做動畫,而Property Animator是通過改變控制項某一屬性值來做動畫的。
**假設我們將一個按鈕從左上角利用補間動畫將其移動到右下角,在移動過程中和移動後,這個按鈕都是不會響應點擊事件的。這是為什麼呢?因為補間動畫僅僅轉變的是控制項的顯示位置而已,並沒有改變控制項本身的值。View Animation的動畫實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪制參數,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效區域還是應用動畫之前的區域;我們看到的效果僅僅是系統作用在按鈕上的顯示效果,利用動畫把按鈕從原來的位置移到了右下角,但按鈕內部的任何值是沒有變化的,所以按鈕所捕捉的點擊區域仍是原來的點擊區域。(下面會舉例來說明這個問題)
這就得到了第三點不同:補間動畫雖能對控制項做動畫,但並沒有改變控制項內部的屬性值。而Property Animator則是恰恰相反,Property Animator是通過改變控制項內部的屬性值來達到動畫效果的
我們前面講了Property Animator包括ValueAnimator和ObjectAnimator;這篇文章就主要來看看ValueAnimator的使用方法吧。
我覺得谷歌那幫老頭是最會起名字的人,單從命名上,就能看出來這個東東的含義。ValueAnimator從名字可以看出,這個Animation是針對值的! ValueAnimator不會對控制項做任何操作,我們可以給它設定從哪個值運動到哪個值,通過監聽這些值的漸變過程來自己操作控制項。 它會自己計算動畫的過程,然後我們需要監聽它的動畫過程來自己操作控制項。
這就是ValueAnimator的功能:ValueAnimator對指定值區間做動畫運算,我們通過對運算過程做監聽來自己操作控制項。
總而言之就是兩點:
1. ValueAnimator只負責對指定的數字區間進行動畫運算
2. 我們需要對運算過程進行監聽,然後自己對控制項做動畫操作
插值器的意義其實就相當於物理公式中的加速度參數,所以這也就是它也叫加速器的原因。 如何自定義插值器:
**input參數與任何我們設定的值沒關系,只與時間有關,隨著時間的增長,動畫的進度也自然的增加,input參數就代表了當前動畫的進度。而返回值則表示動畫的當前數值進度 **
在getInterpolation函數中,我們將進度反轉過來,當傳0的時候,我們讓它數值進度在完成的位置,當完成的時候,我們讓它在開始的位置
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重寫了幾個方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重寫的ofFloat方法如何實現一個動畫:(改變透明度)
前面我們都是定義多個值,即至少兩個值之間的變化,那如果我們只定義一個值呢,如下面的方式:(同樣以MyPointView為例)
僅且僅當我們只給動畫設置一個值時,程序才會調用屬性對應的get函數來得到動畫初始值。如果動畫沒有初始值,那麼就會使用系統默認值。比如ofInt()中使用的參數類型是int類型的,而系統的Int值的默認值是0,所以動畫就會從0運動到100;也就是系統雖然在找到不到屬性對應的get函數時,會給出警告,但同時會用系統默認值做為動畫初始值。
如果通過給自定義控制項MyPointView設置了get函數,那麼將會以get函數的返回值做為初始值。
根據 View setBackGroundColor() 方法可以自定義條用屬性動畫。
④ Android關於shape的gradient屬性詳解
<gradient>
shape的顏色漸變屬性
attributes:
Integer, 代表漸變顏色的角度, 0 is left to right, 90 is bottom to top. 必須是45的整數倍.
默認是 0.該屬性只有在type=linear情況下起作用,默認的type為linear。
默認情況下,從左到右:
angle=270,從上到下 :
android:startColor
Color. 顏色漸變的開始顏色,如angle=270中的 android:startColor="#000000"
android:endColor
Color. 顏色漸變的結束顏色,如賣改angle=270中的 android:endColor="#ffffff"
android:centerColor
Color. 顏色漸變的中間顏色,主要用於多彩。
android:centerX
Float.(0 - 1.0) 相對X的漸變位置。
android:centerY
Float.(0 - 1.0) 相對Y的漸變位置。
這兩個屬性只有在type不為linear情況下起作用。
android:gradientRadius
Float. 漸變顏色的半徑,單賣賣位應該是像素點. 需要 android:type="radial".
如果android:type="radial",沒有設置android:gradientRadius,將會報錯,error inflating class.
加入android:centerColor屬中配逗性
android:type
centerX="0.2" centerX="0.2"
⑤ Android自定義屬性,format詳解
1. reference:參考某一資源ID。
(1)屬性定義:
(2)屬性使用:
2. color:顏納緩色值。
(1)屬性定義:
(洞畝模2)屬性使用:
3. boolean:布爾值。
(1)屬性定義:
(2)屬性使用:
4. dimension:尺寸值。
(2)屬性使用耐如:
5. float:浮點值。
(1)屬性定義:
(2)屬性使用:
6. integer:整型值。
(1)屬性定義:
(2)屬性使用:
android:interpolator = "@anim/動畫ID"
android:fromDegrees = "0"
android:toDegrees = "360"
android:pivotX = "200%"
android:pivotY = "300%"
android:ration = "5000"
android:repeatMode = "restart"
android:repeatCount = "infinite"
/>
⑥ Android屬性系統簡介及使用
Android 里有很多屬性(property),每個屬性都有一個名稱和值,他們都是字元串格式。這些屬性定義了 Android 系統的一些公共系統屬性。借用大神的一句話,系統屬性就是 真·全局變數
屬性變更的請求時init事件循環處理的另一個事件,在Android平台中,為了讓運行中的所有進程共享系統運行時所需要的各種設置值,系統開辟了屬性存儲區域,並提供了訪問該區域的API。屬性由鍵(key)與值(value)構成,其表現形式為「鍵=值」。
在Android平台中,在訪問屬性值時,添加了訪問許可權控制,增強了訪問的安全性。系統中所有運行中的進程都可以訪問屬性值,但僅有init進程才能修改屬性值。其他進程修改屬性值時,必須向init進程提出請求,最終由init進程負責修改屬性值。在此過程中,init進程會先檢查各屬性的訪問許可權,而後再扒余修改屬性值。
當屬性值更改後,若定義在init.rc文件中的某個特定條件得到滿足,則與此條件相匹配的動作就會發生,每個動作都有一個觸發器,決定動作的執行時間,記錄在「on property」關鍵字後的命令即被執行。
個人看來屬性系統有一下四個優點,當然缺點也很明顯,只能支持三種基本類型:string、int、boolean
當編寫本地應用程序時,可以使用 property_get 和 property_set 這兩個API來讀取/設置屬性。要使用它們,我們需要 include cutils/properties.h,並鏈接 libcutils 庫。
以上就是 properties.h 中申明的所有方法,其中 property_set 返回 0 表示執行成功,返回值 <0 表示失敗。
java 層調用 /frameworks/base/core/java/android/os/SystemProperties.java 中的 set 和 get 方法即可設置和獲取系統屬性
通過 JNI 最終調用的還是 /system/core/libcutils/properties.c 中的 property_get 和 property_set
Android toolbox 程序提供了兩個工具: setprop 和 getprop 獲取和設置屬性。其使用方法:
可以通過命令adb shell: getprop查看手機上所有屬性狀態值。
默認情況下,設置屬性只會使 "init" 守護程序寫入共享內存,它不會執行任何腳本或二進製程序。但是,您可以將您的想要的實現的操作與init.rc中某個屬性的變化相關聯拍此巧.例如,在默認的init.rc中有:
這樣,如果你設置persist.service.adb.enable為1 ,"init"守護程序就知道需要採取行動:開啟adbd服務。
只有有許可權的進程才能修改屬性,要不隨便寫一個就改系統屬性那當黑客也太容易了。許可權相關定義襲鍵在下面兩個文件里:
其實一般應用程序都不會去修改系統屬性,所以也不用太在意。
在開機啟動後的init操作中,會執行一個loop循環,當檢測到有新的設置時,進入設置流程,鑒權失敗會提示相關的異常,如sys_prop: permission denied uid:1000 name:gsm.phone.id
通過以上介紹我們可以了解什麼是系統屬性,如何使用,以及一些需要注意的地方。後面會詳細介紹相關原理。
⑦ Android ConfigChanges屬性詳解
當扮謹我們寫ScrollView (滾動查看) 使用豎屏是會正常顯示,但是當我薯咐們進行橫屏切換後
就會重新運行onCreate 方法 ,重新new Fragment 就會產生兩個相似的布局 相互覆蓋。使用configChanges="orientation|keyboardHidden|screenSize" 就可以不再產生相似布局,解決問題。
橫豎屏的切換:
問題:系統語言改變後,activity會調用onDestory()重啟,然後重啟onCreate(),因此一些體驗非常不好。
解決辦法:在activity中配置:
至少在MIUI上面是沒有問題了,但是對於這種配置,對於不同的ROM可能出出現不同的結果,還有以下奇怪的辦法:
比如創建BaseActivity,在BaseActivity的onCreate中監聽系統語言是否發生改變,然後通過eventBus去通數缺純知其他activity更換語言。
⑧ Android ListView常用屬性解析
beforeDescendants:viewgroup會優先其子類控制項而獲取到焦點
afterDescendants:viewgroup只有當其子類控制項不需要獲取焦點時才獲取焦點
blocksDescendants:viewgroup會覆蓋子類控制項而直接獲得焦點
android:drawSelectorOnTop="true" 點擊某一條記錄,顏色會顯示在最上面,記錄上的文字被遮住,所以點擊文字不放,文字就看不到
android:drawSelectorOnTop="false" 點擊某條記錄不放,顏色會在記錄的後面,成為背景色,但是記錄內容的文字是可見的
fadingEdgeLength表示陰影部分的高度,requiresFadingEdge表示陰影的方向
android:fastScrollEnabled="true"
是讓ListView出現快速滾動的按鈕,比較少的item時候不會出現,多了就會出現。不出現原因是數據不多的原因,只要數據足夠多,才會自動出現的。
android:footerDividersEnabled="true" 和android:headerDividersEnabled="true」對應。
api說明是:設成flase時,此ListView將不會在頁腳或者頭部視圖 前畫分隔符。此屬性預設值為true。
這說明這個屬性只對頁腳或者頭部起作用,如果listview中沒有添加頁腳這個屬性就不起作用。
指示該列表總是在固定的單色、不透明的背景下繪制。這允許列表優化其繪制過程
為真時,列表會使用更精確的基於條目在屏幕上的可見像素高度的計算方法。 默認該屬性為真,如果你的適配器需要繪制可變高的條目,他應該設為假。 當該屬性為真時,你在適配器在顯示變高條目時,滾動條的把手會在滾動的 過程中改變大小。當設為假時,列表只使用適配器中的條目數和屏幕上的 可見條目來決定滾動條的屬性
⑨ Android資源標簽屬性及優先順序(一)
在寫前一篇文章 淺述Android Apk打包流程 的時候發現解壓後的apk里res的資源文件,有多於我本地項目中的res資源文件夾。
如果我的項目中依賴了Android的一些庫,比如design庫,design裡面有自己的res,那麼在打包我的項目的時候,這些res會合並一起打包。
我查看了下,我確實依賴了design等庫。
對比一下前三張圖,我本地項目沒有建anim、anim-v21、animator-v21(不再截圖了)等資源文件夾,但是design庫有,最終一並打包到我的項目中。
res目錄下的文件夾是有命名規則的,不能隨便起,為的是要適配不同的設備,而且是要做到最佳的資源匹配。
2.1、資源標簽屬性及優先順序
除了解析度外,同種資源之間可以有下面許多資源屬性標簽,它們在匹配過程中是有優先順序順序的。大家可以快速瀏覽一下即可。以下資源標簽修飾語按照優先順序從高到低的順序排列。
3、Locale(語言和區域)
例如en表示英語,fr表示法語,en-rUS表示英語和美國地區。不區分大小寫,r用於區分區域碼。
4、Layout Direction(布局方向)
ldrtl,布局方向從右到左(阿拉伯語等會這樣布局);ldltr,布局方向從左到右,是默認的隱式值。(這就解答了我前面第二個提的問題了)
5、Smallest Screen Width(最小寬度)
sw<N>dp,屏幕的基本尺寸。
sw320dp:適用於320 320 ldpi、320 480 mdpi、480 480 hdpi
sw600dp:適用於600 1024mdpi (7英寸的平板電腦)
sw720dp:適用於720*1280 mdpi (10英寸平板電腦)
當你的屏幕的絕對寬度大於600dp時,屏幕就會自動調用layout-sw600dp文件夾裡面的布局。這里的絕對寬度是指手機的實際寬度,即與手機是否橫屏沒關系,也就是手機較小的邊的長度。
6、Screen Width(屏幕寬度)
w<N>dp ,設備的可用寬度值隨著當前是橫屏還是豎屏會產生變化,即它表示的是當前真實的寬度值。即當手機豎屏時,為較小邊的長度;當手機橫屏時,為較長邊的長度。
7、Screen Height(屏幕高度)
h<N>dp,與lScreen Width的使用一樣,只是這里指的是相對的高度。指手機相對放置的高度;即當手機豎屏時,為較長邊的長度;當手機橫屏時,為較小邊的長度。
8、Size(屏幕大小)
samll:低密度,最小布局尺寸為320 426dp
normal:中等密度,標准屏幕最小布局尺寸約為320 470dp
large:中等密度,大屏幕最小布局尺寸為480 640dp
xlarge:大於中等密度,最小布局尺寸為720 960dp。基本用於平板電腦。
該配置並不僅適用於指定設備,如果沒有匹配的資源,會選擇與之最近的。 如果所有資源均大於當前屏幕的尺寸限定符,則系統不會使用這些資源,且應用運行時會崩潰。
9、Ratio(屏幕縱橫比)
long:寬屏
notlong:非寬屏
10、Orientation(屏幕方向)
port:豎向的
land:橫向的
square:正方形的(我也不知道這個是什麼樣子的)
11、UI Mode(UI模式)
無、car、desk、 television、appliance、 watch6種模式。(其實我沒看明白是幹嘛的,哈哈)
12、Night Mode(夜間模式)
night:夜間模式
notnight:非夜間模式
可以通過UiModeManager來開啟和關閉這一功能。
13、Density(屏幕像素密度)
ldpi:低密度,約120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配設備密度的點陣圖資源;tvdpi:主要用於電視,約213dpi。anydpi:適用於所有密度,優先順序高於其他限定符。
14、Touch Screen(觸摸屏)
notouch:設備不帶觸摸屏
stylus:觸摸屏通過手寫筆操作
finger:觸摸屏通過手指操作
15、Keyboard(鍵盤可用性)
keysexposed:設備有可用鍵盤。如果當前的軟鍵盤被啟用,那麼即便設備沒有鍵盤或者鍵盤不可用,這個狀態仍可能有效。
keyshidden:設備有鍵盤,但當前被隱藏,而且沒有軟鍵盤啟用。
keyssoft:設備當前軟鍵盤啟動,即便它處於可見或不可見狀態。
16、Text Input(文本輸入法)
nokeys:設備不帶用用於文本輸入的按鍵
qwerty:設備具有標准硬鍵盤(無論是否對用戶可見)
12key:設備具有 12 鍵硬鍵盤(無論是否對用戶可見)
17、Navigation State(定位鍵可用性)
描述定位鍵是否可用,指的是游標定位,非GPS導航的定位。
navexposed:定位鍵對用戶可用
navhidden:定位鍵對用戶不可用
18、Navigation Method(主要的非觸摸屏定位方式)
nonav:設備除了觸摸屏外沒有其他定位方式
dpad:設備具有用於導航的方向鍵
trackball:設備具有用於導航的軌跡球
wheel:設備有方向滾輪用於定位,不常用
19、Dimension(尺寸)
20、Version(平台版本)
設備支持的 API 級別。例如v4 對應於 API 級別 4,帶有 Android 1.6 或更高版本系統的設備。
2.2、怎麼在AS中創建這些文件夾呢?
⑩ Android自定義屬性TypedArray詳解
大家好,我是程序員雙木L,後續會發專題類的文章,這是自定義控制項的第一篇,之後也會陸續更新相關的文章,歡迎關注。
自定義屬性在自定義控制項過程中屬於比較常見的操作,我們可以回想一下這樣的場景:自定義view的過程中,我們需要在不同的情況下設置不同的文字大小,那麼我們是不是就需要提供對外的方法來設置,這樣就比較靈活操作。而我們自定義對外的方法,就是我們自定義的屬性啦,那我們來分析一下其原理及作用。
下面我們根據例子來進行分析:
1、首先我們需要在res->values目錄下新建attrs.xml文件,該文件就是用來聲明屬性名及其接受的數據格式的,如下:
attr名詞解析:
name表示屬性名,上面的屬性名是我自己定義的。
format表示接受的輸入格式,format格式集合如下:
2、自定義屬性的使用,這里我們使用兩種方式進行對比解析
最最最原始的使用方式
(1)、自定義文件如下:
我們可以在TestAttrsView方法的參數AttributeSet是個xml解析工具類,幫助我們從布局的xml里提取屬性名和屬性值。
(2)、在布局文件xml中的使用
這里使用自定義屬性需要聲明xml的命名空間,其中app是命名空間,用來加在自定義屬性前面。
xmlns:app=" http://schemas.android.com/apk/res-auto "
聲明xml命名空間,xmlns意思為「xml namespace」.冒號後面是給這個引用起的別名。
schemas是xml文檔的兩種約束文件其中的一種,規定了xml中有哪些元素(標簽)、
元素有哪些屬性及各元素的關系,當然從面向對象的角度理解schemas文件可以
認為它是被約束的xml文檔的「類」或稱為「模板」。
(3)、將屬性名與屬性值列印結果如下:
從列印結果我們可以看出,AttributeSet將布局文件xml下的屬性全部列印出來了,細心的童鞋可能已經看出來:
這個屬性我們設置的是一個整數尺寸,可最後列印出來的是資源編號。
那如果我們想要輸出我們設置的整數尺寸,需要怎麼操作呢?
這個時候就該我們這篇的主角出場了,使用TypedArray方式。
(1)、這里我們需要將attrs.xml使用「declare-styleable」標簽進行改造,如下:
從改造後的attrs文件可以看出,我們將屬性聲明歸結到TestStyleable裡面,也就意味著這些屬性是屬於TestStyleable下的。
(2)、屬性的解析:
這里我直接列印出解析結果,這里可以獲取我們想要的自定義屬性,而系統有的屬性可以忽略。
(3)、運行結果如下
從解析的結果可以看出,尺寸的結果已經轉換為實際值了:
這個時候有童鞋又問了,我設置的是15dp,為啥最後列印是41.25了呢?其實解析出來的值單位是px,所以這里輸出的是轉換後的值。
解析的過程中用到了這個方法:
我們來看一下這個方法的源碼:
源碼中我們可以看到這個方法有兩個參數:
obtainStyledAttributes方法返回值類型為TypedArray。該類型記錄了獲取到的屬性值集合,而通過數組下標索引即可找到對應的屬性值。索引下標通過R.styleable.TestStyleable_xx獲取,"xx"表示屬性名,一般命名為"styleable名" + "_" + "屬性名"。
而TypedArray提供了各種Api,如getInteger,getString,getDimension等方法來獲取屬性值,這些方法都需要傳入對應屬性名在obtainStyledAttributes中的int數組的位置索引,通過下標獲取數組里屬性值。
這個TypedArray的作用就是資源的映射作用,把自定義屬性在xml設置值映射到class,這樣怎麼獲取都很簡單啦。
到這里就分析完啦!