Android自定義View 自定義元件

2021-08-16 03:32:56 字數 3261 閱讀 8171

自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承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...