自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp;今天主要分析下自定義元件;還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext()方法,怎麼畫了?還是得一步一步來:
(1) )寫乙個mytextview類繼承view,重寫三個構造方法,當然還有ondraw()和onmeasure()方法,如下**:
public
class
mytextview
extends
view
public
mytextview(context context, attributeset attrs)
public
mytextview(context context, attributeset attrs, int defstyleattr)
@override
protected
void
ondraw(canvas canvas)
@override
protected
void
onmeasure(int widthmeasurespec, int heightmeasurespec)
(2) 接下來就要想既然是textview,那肯定是有text,color,textsize等屬性。在values目錄下的attrs.xml中定義好這些屬性,以便在xml中引入mytextview能夠直接操作這些值,然後在有三個引數的構造方法裡面將這些屬性與控制項關聯,如下:
attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
name="mytextview">
name="textcolor"
format="color|reference"/>
name="textsize"
format="dimension|reference"/>
name="text"
format="string|reference"/>
declare-styleable>
resources>
public mytextview(context context, attributeset attrs, int defstyleattr)
這裡解釋下三個構造方法,一般乙個引數的呼叫兩個引數的,兩個引數呼叫三個引數的,屬性與控制項的關聯寫在三個引數的構造方法裡面即可。(3) 已經定義好了屬性,那接下來在構造方法裡用paint畫筆設定好這些屬性,然後用ondraw方法裡面的canvas畫乙個textview,如下:
public mytextview(context context, attributeset attrs, int defstyleattr)
@override
protected void ondraw(canvas canvas)
**ondraw方法裡面的baseline是基線,在android中,文字的繪製都是從baseline處開始的,所以第三個引數y不是這個文字中心在螢幕的位置,而是文字基線在螢幕的位置,感興趣的可移至baseline
到現在其實我們的畫的mytextview已經可以用了,額?不是還有乙個onmeasure方法什麼都沒有寫嗎,不急我們先在xml中引入試試看效果**
可以看到,我們設定textview的寬高都是wrap_content,但是執行之後都佔滿了螢幕,之前重寫的onmeasure方法就就派上用場了上面我們設定了高為wrap_content,但是我們沒有測量textview的高,如果指定了為wrap_content,那麼此時的高應該是textview本身的高,所以需要測量然後返回給父容器,下面我們重寫onmeasure方法:
@override
protected
void
onmeasure(int widthmeasurespec, int heightmeasurespec)
private
intmeasurewidth(int widthmeasurespec)else
if(mode == measurespec.at_most)
return width;
}private
intmeasureheight(int heightmeasurespec)else
if(mode == measurespec.at_most)
return height;
}
再來試試效果
現在textview測量完成了,已經可以設定寬高了,寬高設定為wrap_content則是textview本身的寬高,因為我們還考慮了padding,所以也可以設定textview的padding,如果測量時沒考慮padding在xml中設定是不起作用的,有興趣的的可以試一試
自定義元件和自定義容器的一些小demo,有興趣的可以移至ownerdraw
Android自定義View實現
android自定義view實現很簡單 繼承view或者其子類,重寫建構函式 ondraw,onmeasure 等函式,根據繼承的類的不同可能有所不同。如果自定義的view需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。在使用到自定義view的xml布局檔案中需要...
Android 自定義View 一
android的ui介面都是由view和viewgroup及其派生類組合而成的。其中,view是所有ui元件的基類,而viewgroup是容納這些元件的容器,其本身也是從view派生出來的。androidui介面的一般結構可參見下面的示意圖 可見,作為容器的viewgroup可以包含作為葉子節點的v...
Android 自定義View 二
自定義view首先要實現乙個繼承自view的類。新增類的構造方法,override父類的方法,如ondraw,onmeasure 等。如果自定義的view有自己的屬性,需要在values下建立attrs.xml檔案,在其中定義屬性,同時 也要做修改。乙個簡單的例子,畫一條豎直線 public cla...