前言:
本文主要講述自定義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布局檔案中需要...