自定義View詳解

2021-09-02 23:28:43 字數 4586 閱讀 1512

自定義view可能大家平常都會使用到,但是一般都是複製乙個別人的**,還沒有過完全自己寫的自定義view吧。自定義view一般使用在自定義進度條時會用到。自定義可以簡單理解為封裝的textview、button等都是繼承自view。

自定義view需要學習三個變數屬性;canvas(畫布)、paint(畫筆)、rect(尺寸)

可以用來實現各種圖形的繪製工作,如繪製直線、矩形、圓等等    

1、繪製直線:canvas.drawline(float startx, float starty, float stopx, float stopy, paintpaint) //畫線,引數一起始點的x軸位置,                           引數二起始點的y軸位置,引數三終點的x軸水平位置,引數四y軸垂直位置,最後乙個引數為paint 畫刷物件。

2、繪製矩形:canvas.drawrect(rectf rect, paint paint) //繪製區域和畫筆樣式

3、繪製圓形:canvas.drawcircle();引數一是中心點的x軸,引數二是中心點的y軸,引數三是半徑,引數四是paint物件;

4、繪製字元:canvas.drawtext(string text, float x, floaty, paint paint) //渲染文字,canvas類除了上面的還可以描繪文字,參                             數一是string型別的文字,引數二x軸,引數三y軸,引數四是paint物件。

5、繪製圖形:canvas.drawbitmap(bitmap bitmap, rect src, rect dst, paint paint) //引數一就是我們常規的bitmap物件,引數                           二是源區域(這裡是bitmap),引數三是目標區域(應該在canvas的位置和大小),引數四是paint畫刷物件

6、繪製圓弧:canvas.drawarc();引數一是rectf物件,乙個矩形區域橢圓形的界限用於定義在形狀、大小、電弧,引數二是起                          始角(度)在電弧的開始, 引數三掃瞄角(度)開始順時針測量的,引數四是如果這是真的話,包括橢圓中心的電弧,並                          關閉它,如果它是假這將是乙個弧線,引數五是paint物件;

7、繪製乙個路徑:canvas.drawpath(path path, paint paint) //引數一為path路徑物件

8、畫點:canvas.drawpoint(float x, float y, paint paint) //引數一水平x軸,引數二垂直y軸,第三個引數為paint物件。

9、畫橢圓:canvas.drawoval(rectf oval, paint paint)//引數一是掃瞄區域,引數二為paint物件;

要繪製圖形,首先得調整畫筆,按照自己的開發需要設定畫筆的相關屬性

1、setantialias(boolean aa) // 是否抗鋸齒

2、setcolor(int color) // 設定顏色,這裡android內部定義的有color類包含了一些常見顏色定義

3、setargb(int a, int r, int g, int b) // 設定 paint物件顏色,引數一為alpha透明值

4、setalpha(int a) // 設定alpha不透明度,範圍為0~255

5、settextsize(float textsize) // 設定字型大小

6、setstyle():設定畫筆的風格(空心或實心)

7、setstrokewidth():設定空心邊框的寬度

8、getcolor():獲取畫筆的顏色

9、settextscalex(float scalex) // 設定文字縮放倍數,1.0f為原始

10、setunderlinetext(booleanunderlinetext) // 設定下劃線

設定畫布大小new rect(int left, int top, int right, int bottom)

(1)新定義乙個類,繼承view,需要重新ondraw方法,在這裡就是對頁面進行重新畫圖。效果圖如下,可能不太好看。

(2)實現**:其中在**中都有詳細解釋

public class customviewactivity extends view

/** 當view的大小發生改變時,會呼叫此方法

* */

@override

protected void onsizechanged(int w, int h, int oldw, int oldh)

/** 這個方法就是自定義view的核心。繪製各種圖形

* */

@override

protected void ondraw(canvas canvas) , null, shader.tilemode.repeat); //

p.setshader(mshader);

//畫圓,橫座標、縱座標

canvas.drawcircle(120, 100, 100, p);// 大圓

//圓形進度條

barpaint.setcolor(color.red);

//設定抗鋸齒,如果不設定,載入點陣圖的時候可能會出現鋸齒狀的邊界,如果設定,邊界就會變的稍微有點模糊,鋸齒就看不到了。

barpaint.setantialias(true);

/** // style有3種型別:

// 型別1:paint.style.fillandstroke(描邊+填充)

// 型別2:paint.style.fill(只填充不描邊)

// 型別3:paint.style.stroke(只描邊不填充)

* */

barpaint.setstyle(paint.style.stroke);

//設定畫筆的粗細

barpaint.setstrokewidth(20);

//定義位置

circlebounds = new rectf(200, 200, 264, 264);

///*

* 畫弧形的大小和開始位置

* 引數一:位置

* 引數二:開始角度

* 引數三:弧形長度

* 引數4:true:則為包括圓形中心的電弧。

* 引數五:圓弧的顏色和圓弧寬度等資訊

* */

canvas.drawarc(circlebounds, progress - 90, 50, false,

barpaint);}/*

* 開啟定時器功能,實現實時重新整理頁面旋轉

* */

private handler spinhandler = new handler() else

if (progress > 360)

spinhandler.sendemptymessagedelayed(0, 0);}};

}

(3)在xml中的呼叫方式

<?xml version="1.0" encoding="utf-8"?>

public progresswheel(context context, attributeset attrs) 

private void parseattributes(typedarray a)

barcolor = a.getcolor(r.styleable.progresswheel_barcolor, barcolor);

barlengt = (int) a.getdimension(r.styleable.progresswheel_barlengt,

barlengt);

textsize = (int) a.getdimension(r.styleable.progresswheel_textsize,

textsize);

textcolor = a.getcolor(r.styleable.progresswheel_textcolor,

textcolor);

//if the text is empty , so ignore it

if (a.hasvalue(r.styleable.progresswheel_text))

rimcolor = a.getcolor(r.styleable.progresswheel_rimcolor,

rimcolor);

circlecolor = a.getcolor(r.styleable.progresswheel_circlecolor,

circlecolor);

contourcolor = a.getcolor(r.styleable.progresswheel_contourcolor, contourcolor);

contoursize = a.getdimension(r.styleable.progresswheel_contoursize, contoursize);

// recycle

a.recycle();

}

Android自定義View 自定義元件

自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...

自定義view之自定義屬性

1.首先在res的values檔案下新建乙個名為attrs.xml檔案 在該xml檔案中編寫我們需要的屬性 declare styleable後面的name必須要與接下來要自定義的view名一致。attr 後面的name表示需要自定義的屬性,format表示這些屬性的型別 2.新建乙個類繼承text...

自定義view 二

自定義view的最重要的乙個部分是自定義它的外觀。根據你的程式的需求,通過ondraw方法實現繪製。在ondraw中,會傳遞給你乙個canvas。canvas封裝了繪製圖形的方法。還需要自定義乙個 paint去定義顏色樣式的填充 簡單來說 canvas定義你在螢幕上畫的圖形,而paint定義顏色,樣...