上一篇講的自定義view說的不夠精簡,這篇說的詳細點墓贿,簡單點茧泪,大家一起學習
自定義繪制的方式是重寫繪制方法蜓氨,繪制方法不是一個,其中最常用的是 onDraw()队伟,onDraw()負責的是View的整體繪制穴吹,具體執(zhí)行繪制操作的是onDraw()里面的canvas參數(shù)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
繪制的關(guān)鍵是 Canvas 的使用
Canvas 的繪制類方法: drawXXX() (關(guān)鍵參數(shù):Paint)
Canvas 的輔助類方法:范圍裁切和幾何變換
這里就使用canvas來畫一個圓跟一個正方形
先自定義一個TextView(隨便寫的,不要計較)嗜侮,構(gòu)造函數(shù)都要實現(xiàn)
public class MyTextView extends TextView {
Paint paint = new Paint();
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(450,450,50,paint); //畫圓 其中450表示坐標位置港令,圓的x、y軸坐標位置都是圓心的位置锈颗,50表示圓的半徑
canvas.drawRect(300,250,400,350,paint); 畫正方形
}
}
上面用到了paint對象顷霹,paint可以設(shè)置顏色,設(shè)置線條的粗細击吱,陰影啊一系列東西淋淀。
下面再講兩個方法
Canvas.drawXXX()是針對整個畫布進行操作
Paint是對你畫出來的東西進行操作,比如剛才畫的圓覆醇,我們可以通過paint.setColor(Color.parseColor("#88880000"));來設(shè)置圓的背景色
Paint 類的幾個最常用的方法朵纷。具體是:
Paint.setStyle(Style style) 設(shè)置繪制模式
Paint.setColor(int color) 設(shè)置顏色
Paint.setStrokeWidth(float width) 設(shè)置線條寬度
Paint.setTextSize(float textSize) 設(shè)置文字大小
Paint.setAntiAlias(boolean aa) 設(shè)置抗鋸齒開關(guān)
我去。叫乌。柴罐。。憨奸。革屠。。排宰。似芝。。板甘。說自定義View我怎么把坐標系這個概念忘了說党瓮,f**k。
趕緊百度一下
View 提供了如下 5 種方法獲取 View 的坐標:
- View.getTop()盐类、View.getLeft()寞奸、View.getBottom()、View.getRight();
- View.getX()在跳、View.getY();
- View.getTranslationX()枪萄、View.getTranslationY();
- View.getLocationOnScreen(int[] position);
- View.getLocationInWindow(int[] position);
1.png
好了,圖是拷貝來的猫妙,作者的博客鏈接是https://blog.csdn.net/u013872857/article/details/53750682
可以去學習下View的坐標系概念瓷翻,我就是懶,忘了去總結(jié)下,就不多說了這個齐帚,百度一下有很多人講的比我詳細的多妒牙,2333333333
上面說過了怎么給圓設(shè)置背景,接下來就設(shè)置一個紅色的圓吧
onDraw()方法里這樣操作就好啦
paint.setColor(Color.RED); // 設(shè)置為紅色
canvas.drawCircle(300, 300, 200, paint);
如果要設(shè)置一個空心圓的話对妄,上面已經(jīng)說過了湘今,通過paint對象就可以啦
把繪制模式改為畫線模式就好啦
paint.setStyle(Paint.Style.STROKE);
這里是通過paint對象的style方法對畫的內(nèi)容來設(shè)置一個style
通過代碼可以看到,style有三種饥伊,之前的代碼告訴我們這里style默認使用的是FILL這種填充模式象浑,STROKE就是蔫饰。琅豆。。啥呢篓吁,不填充模式(畫線模式)茫因,F(xiàn)ILL_AND_STROKE就是既畫線也填充
這樣問題又來了,馬丹UI喜歡設(shè)計一下杖剪,這個線要多粗多粗冻押,怎么辦?
Paint.setStrokeWidth(float width)這個方法一下子就把UI的要求解決了盛嘿,我們可以通過這個方法來設(shè)置線條的寬度
這里的單位是像素洛巢。
經(jīng)常遇到寫按鈕的時候,按鈕需要一個弧度次兆,圓角矩形稿茉。一般自己定義個shape,然后設(shè)置顏色啊什么的芥炭,遇到變態(tài)的漓库,顏色不一致還要設(shè)置多個shape。
下面就來畫一下圓角矩形
canvas.drawRoundRect(100, 100, 500, 300, 50, 50, paint);
其中园蝠,left, top, right, bottom 是四條邊的坐標渺蒿,rx、ry是圓角的弧度彪薛,就是圓角的橫向半徑和縱向半徑
畫橢圓就是canvas.drawOval(50, 50, 350, 200, paint);都是canvas的方法堆砌啦
畫線canvas.drawLine(200, 200, 800, 500, paint); 方法里的參數(shù)startX, startY, stopX, stopY 分別是線的起點和終點坐標茂装。
下面再說一下 繪制扇形和弧形圖
left, top, right, bottom 描述的是這個弧形所在的橢圓;startAngle 是弧形的起始角度(x 軸的正向善延,即正右的方向少态,是 0 度的位置;順時針為正角度挚冤,逆時針為負角度)况增,sweepAngle 是弧形劃過的角度;useCenter 表示是否連接到圓心训挡,如果不連接到圓心澳骤,就是弧形歧强,如果連接到圓心,就是扇形为肮。
這篇就說這些簡單的利用canvas畫一些簡單的圖吧~~~