Android自定義View的使用(基礎篇)

2021-09-05 01:14:18 字數 3802 閱讀 5384

前言:

本文主要講述自定義view中paint、canvas以及path的使用,不牽扯到pathmeasure和matrix,提供畫一些常見的點、線、面、矩形、圓、橢圓以及不規則圖形。

另外需注意:android的座標系和數學中的座標系是有區別的,android的座標系是以螢幕的左上角為座標原點,垂直向下是y軸的正方向,切勿和數學座標系混淆。

先上圖形:

一、自定義view常用方法

1.構造方法

自定義view的構造方法有四種,分別是一參二參三參四參,三參四參很少用,主要講解下一參和二參的區別;

一參:在code中初始化自定義view的時候呼叫較多;

二參:在xml中使用自定義view時會呼叫;

2.ondraw:提供畫布(canvas),用來畫介面

3.onmeasure:測量螢幕尺寸,常用方法是getsize和getmode,例(獲取螢幕寬度):measurespec.getsize(widthmeasurespec);

4.onsizechanged:在view size發生變化時呼叫,可以獲取old view的size和更新後view的size

二、paint的使用

1.初始化

paint = new paint();

paint.setcolor(color.red);//設定顏色

paint.setstyle(paint.style.fill);//設定paint的型別(包含fill、stroke和fill_and_stroke三種)

paint.setstrokewidth(10f);//設定線寬

2.畫常見圖形

//點canvas.drawpoint(50, 100, paint);

//一組點

canvas.drawpoints(new float, paint);

//線canvas.drawline(250, 100, 300, 100, paint);

//矩形

canvas.drawrect(new rect(350, 50, 500, 150), paint);

//圓角矩形

canvas.drawroundrect(new rectf(550, 50, 700, 150), 5, 5, paint);

//橢圓

canvas.drawoval(new rectf(750, 50, 900, 150), paint);

//圓canvas.drawcircle(1000, 100, 50, paint);

//圓弧

canvas.drawarc(new rectf(1100, 50, 1200, 150), 180, 90, true, paint);

//空心圓

paint.setstyle(paint.style.stroke);

canvas.drawcircle(100, 250, 50, paint);

//餅狀圖

paint.setstyle(paint.style.fill);

rectf rectf = new rectf(250, 200, 350, 300);

canvas.drawarc(rectf, 0, 60, true, paint);

paint.setcolor(color.gray);

canvas.drawarc(rectf, 60, 150, true, paint);

paint.setcolor(color.green);

canvas.drawarc(rectf, 210, 90, true, paint);

paint.setcolor(color.yellow);

canvas.drawarc(rectf, 300, 60, true, paint);

////文字

3.例項

通過以上方法,基本可以滿足一些規則圖形的需求,例如扇形圖表、折線圖等,另外也可結合handler的使用通過invalidate()方法實現動態的效果;

如下就是簡單實現圓柱注水效果的code:

//畫動態水柱

canvas.drawroundrect(new rectf(100, 600, 200, 1000), 50, 50, paint);

paint.setcolor(color.green);

//下canvas.drawarc(new rectf(110, 900, 190, 990), 90 - waterangle, 2 * waterangle, false, paint);

//中canvas.drawrect(new rectf(110, waterheight, 190, 950), paint);

//上if (waterangle02 == 0) else

if (waterangle < 90) else else if (waterangle02 < 90)

}//動態水柱

private float waterangle = 0;

private float waterangle02 = 0;

private int waterheight = 950;

private handler mhandler = new handler()

} else if (msg.what == 2)

} else if (msg.what == 3) }}

};三、canvas的使用

畫布的使用主要為了更加快捷的確定座標系的位置,模擬我們現實中的畫板,如果你想畫出來乙個倒在地上的金字塔,不如在作畫前先將畫板向右旋轉90度,然後畫乙個正常的金字塔,完成作品後,再將畫紙向左旋轉回來,就能達到想要的效果。以下介紹幾種畫布常見的操作方法:

1.平移:canvas.translate(150, 0);//將畫布向右平移150

2.旋**canvas.rotate(30, 100, 100);//將畫布圍繞點(100, 100)旋轉30度

3.縮放:canvas.scale(2f, 2f, 100, 100);//將畫布以點(100, 100)放大兩倍

四、path的使用

canvas除了有draw點draw線draw矩形等方法,還可以drawpath(path path, paint paint);

雖然都是要paint來畫,但是drawpath不同的是可以畫很多不規則圖形,形狀取決於path;

1.首先path也可以畫規則圖形,方法基本類似canvas中畫基本圖形的方法

2.特別介紹path中不同於canvas畫基本圖形的幾個方法

path.lineto():在路徑上新增乙個點

path.moveto():移動到下次lineto的起點

path.setlastpoint():設定上次操作的最後乙個點的位置

path.close():封閉路徑

path.quadto():用來畫貝塞爾曲線(大部分複雜的自定義view都會用到貝塞爾曲線)

3.簡單的貝塞爾曲線的使用

為了實現根據touch點來繪製指定的貝塞爾曲線:

public class bezierview extends view

@override

protected void ondraw(canvas canvas)

@override

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

@override

public boolean ontouchevent(motionevent event)

}

Android自定義View 自定義元件

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

Android自定義View 一 View的測量

想要讓系統繪製出你所需要的圖形,就必須告訴系統view的大小,所以,在繪製view時,先實現view的onmesure 方法。在測量view之前,要先了解measurespec這個類,measurespec物件中包含了測量的模式和測量的大小 measurespec.exactly 精確模式 當我們將...

Android自定義View實現

android自定義view實現很簡單 繼承view或者其子類,重寫建構函式 ondraw,onmeasure 等函式,根據繼承的類的不同可能有所不同。如果自定義的view需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。在使用到自定義view的xml布局檔案中需要...