在android中,無論是熟知的布局,還是控制項,統統全都繼承自基類view。
自定義view實現有幾種:
view的繪製基本由measure()、layout()、draw()這個三個函式完成:
在android座標系中,以螢幕左上角作為原點,這個原點向右是x軸的正軸,向下是y軸正軸。
結合以上的api,可以計算出檢視的寬度和高度,可以使用如下方式計算:
這裡我們介紹最複雜的一種,自定義view。
無論是繼承系統view還是直接繼承view,都需要對建構函式進行重寫,建構函式有多個,至少要重寫其中乙個才行。
public class customview extends view
/*** 在xml布局檔案中使用時會自動呼叫該方法
*/public customview(context context, attributeset attrs)
...//更多引數的建構函式
}
android系統的控制項以android開頭的都是系統自帶的屬性。為了方便配置自定義view的屬性,我們也可以自定義屬性值。android自定義屬性可分為以下幾步:
attrs.xml檔案示例如下:
<?xml version="1.0" encoding="utf-8"?>
**實現示例如下:
public class mytextview extends view
}
布局檔案使用示例如下:
measurespec是view的內部類,它封裝了乙個view的尺寸,在onmeasure()當中會根據這個measurespec的值來確定view的寬高。measurespec的值儲存在乙個int值當中。乙個int值有32位,前兩位表示模式mode後30位表示大小size。即measurespec = mode + size。
在measurespec當中一共存在三種mode:
常見的使用方式如下:
// 獲取測量模式(mode)
int specmode = measurespec.getmode(measurespec)
// 獲取測量大小(size)
int specsize = measurespec.getsize(measurespec)
// 通過mode 和 size 生成新的specmode
int measurespec=measurespec.makemeasurespec(size, mode);
整個測量過程的入口位於view的measure方法當中,該方法做了一些引數的初始化之後呼叫了onmeasure方法,這裡我們主要分析onmeasure。onmeasure原始碼如下:
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
layout()過程,對於view來說用來計算view的位置引數,對於viewgroup來說,除了要測量自身位置,還需要測量子view的位置。layout()方法是整個layout()流程的入口,並在layout方法中呼叫了onlayout方法,主要是進行子view的計算。
draw流程也就是的view繪製到螢幕上的過程,整個流程的入口在view
的draw()
方法之中,而原始碼注釋也寫的很明白,整個過程可以分為6個步驟:
自定義view在android的開發中的重要性還是很大的,因為僅僅靠系統提供的控制項和元件,無論是美觀度還是使用度,再或者是新特性上,都無法滿足特定的業務場景。因此,常常要用到自定義view,這就要求要在自己的專案自己完成特殊控制項的自主開發。自定義控制項在開發過程中也屬於重點和難點,應該多花時間進行學習和研究,重點有以下幾個:
Android 自定義控制項
幹android也有一段的時間了,自定義這塊的東西覺得還是很有比較複習一下基礎的東西。自定義控制項和自定義元件基本上的使用都是在專案中基本的android控制項滿足不了需求的時候使用的。所以,如果要高出特別炫的特效,或者比較特殊的控制項排列方式,例如瀑布流,那麼就要好好學學自定義咯。首先,先簡單的介...
android自定義控制項
android自定義控制項 二 入門,繼承view 說說android 兩種為自定義元件新增屬性的使用方法和區別 自定義控制項的屬性 自定義控制項 今天花了3,4個小時看了自定義控制項,看 懂了,還沒有實踐,因為時間不夠,日後實踐。總結下 自定義控制項有3種方式 繼承已有控制項 繼承乙個容器控制項,...
Android自定義控制項
android學習筆記,整理給自己複習的時候看的,謝謝!1.自定義開關 1.宣告介面物件 public inte ce onswitchstateupdatelistener 2.新增設定介面物件的方法,外部進行呼叫 public void setonswitchstateupdatelistene...