概述
Android自定義View 其實就是:布局萨螺、繪制 呕童、觸摸反饋。在繪制的過程中傍妒,不管是直方圖蛉签,餅圖,還是其他各種各樣復雜的界面沥寥,使用自定義繪制都能很輕松的繪制出來碍舍,這個就是自定義繪制的過程。
1邑雅、Android的繪制是在每個view的繪制方法里發(fā)生的片橡,
一個view的繪制方法里寫了什么代碼,他就繪制什么內容淮野,而自定義繪制就是通過重寫繪制方法捧书,插入你自己的繪制代碼來實現的。繪制方法不是只有一個骤星,最常用的是onDray()经瓷。onDray()這個繪制方法,他負責的是View的主體的繪制洞难。例如TextView的文字舆吮,ImageView的圖像,都是在onDray()里繪制的队贱,具體執(zhí)行繪制的是onDray()里面的canvas函數色冀。Canvas 是 畫布 ,現實中的畫布是畫的載體柱嫌,你把畫 畫在了載體上锋恬,在Android里面,Canvas就是一個繪制工具编丘,他唯一的功能就是繪制与学。實際上,你所見到的Android界面瘪吏,基本上都是由Canvas來繪制的癣防。(除了一些游戲,一些3D游戲會用到OpenGl)掌眠,所以掌握了Canvas蕾盯,你就基本上能做出所有的界面了。
2、Canvas Paint
Paint本意是顏料级遭,Android里的Paint他是一個加強版的顏料望拖,他負責提供使用的顏色和風格信息。(所謂風格挫鸽,就是這個圓是空心還是實心说敏,線條粗細是多少,有沒有陰影丢郊,等等這些附加信息)盔沫。
3、Canvas 除了直接的繪制枫匾,他還有一些方法架诞,對繪制進行輔助。
1干茉、直接對繪制范圍的裁切谴忧。(就是將繪制限定在某個范圍內,超出的部分全部被裁掉角虫,這些方法全部以clip-開頭)
2沾谓、繪制內容的幾何變換。(例如戳鹅,放大縮小均驶,平移旋轉,還有錯切粉楚,水平錯切垂直錯切辣恋。繪制內容的集合變換可以理解為把你的繪制區(qū)域的四個頂點任意拉扯,繪制的內容就會發(fā)生變化)
4模软、繪制順序
Android里面的繪制是嚴格按照順序的伟骨,先繪制的內容會被后繪制的內容覆蓋掉。
總結
自定義繪制
- 自定義繪制的方式:重寫繪制方法(最重要的方法:onDray());
- 自定義繪制的關鍵:Canvas燃异,他是一個繪制工具携狭,主要有繪制和對繪制的輔助這兩類方法。
- Canvas的繪制方法:drawXXX()(關鍵參數:Paint(他用來保存顏色和各種風格信息))
- Canvas的輔助類方法:一種是范圍裁切(clipXXX())回俐,一種是對繪制內容的幾何變換(Matrix)逛腿;
- 使用不同的繪制方法來控制遮蓋關系。
自定義View常用方法的介紹
例:
仿寫TextView繼承自View仅颇,構造方法的調用
onMeasure():用于測量单默,測量你的控件的大小。
onDraw():用于繪制忘瓦,你的控件將要繪制成什么樣子搁廓。
onTouch():用于觸摸,處理與用戶交互
自定義屬性:用于配置。
onMeasure()
MeasureSpec 類
Android 提供MeasureSpec類境蜕,他可以幫助我們測量View蝙场,MeasureSpec是一個32位的int值,其中高2位為測量的模式粱年,低30位為測量的大小售滤,在計算中使用位運算是為了提高并優(yōu)化效率。
測量模式:
1台诗、EXACTLY
精確模式完箩,一個確定的值,layout_width="100dp","match_parent","fill_parent"拉队;
2嗜憔、AT_MOST
包裹內容,既最大值模式氏仗,layout_width="wrap_content"
3、UNSPECIFIED
任意大小夺鲜,想要多大就多大皆尔,盡可能大,一般我們不會遇到币励,如ListView慷蠕,RecyclerView,ScrollView測量子View的時候給的就是UNSPECIFIED 食呻,一般開發(fā)中不需要關注它流炕;
View類默認的onMesaure()方法只支持EXACTLY模式,所以在自定義控件的時候仅胞,如果不重新onMesure()方法的話每辟,就只能使用EXACTLY模式。
在查看系統代碼會發(fā)現干旧,系統最終會調用setMeasuredDimension(int measuredWidth,int measuredHeight)方法將測量后的值設置進去渠欺。
onDraw()
提前創(chuàng)建好 Paint 對象,重寫 onDraw()椎眯,把繪制代碼寫在 onDraw() 里面挠将,這就是自定義繪制最基本的實現。
Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 繪制一個圓
canvas.drawCircle(300, 300, 200, paint);
}
Canvas.drawXXX() 和 Paint 基礎
drawXXX() 系列方法和 Paint 的基礎掌握了编整,就能夠應付簡單的繪制需求舔稀。它們主要包括:
Canvas 類下的所有 draw- 打頭的方法,例如 drawCircle() drawBitmap()掌测。
Paint 類的幾個最常用的方法内贮。具體是:
Paint.setStyle(Style style) 設置繪制模式
Paint.setColor(int color) 設置顏色
Paint.setStrokeWidth(float width) 設置線條寬度
Paint.setTextSize(float textSize) 設置文字大小
Paint.setAntiAlias(boolean aa) 設置抗鋸齒開關
onTouch()
從寫onTouch()方法,用來處理觸摸事件與用戶交互。
/**
* 處理跟用戶交互的贺归,手指觸摸等等
* @param event 事件分發(fā)事件攔截
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 手指按下
Log.e("TAG","手指按下");
break;
case MotionEvent.ACTION_MOVE:
// 手指移動
Log.e("TAG","手指移動");
break;
case MotionEvent.ACTION_UP:
// 手指抬起
Log.e("TAG","手指抬起");
break;
}
return super.onTouchEvent(event);
}
自定義屬性
自定義屬性就是做到配置不寫死淆两,比如我在TextView中text配置什么就顯示什么,textColor指定什么顏色就顯示什么顏色等等拂酣,這些都是自定義屬性秋冰。首先在res下的values目錄下新建一個attrs.xml文件,其他名稱可以嗎婶熬?是可以的如attr.xml或者lqbz.xml但是原則上一看attrs就知道是自定義屬性剑勾。
引用
Hencoder 自定義View1
紅橙Darren 自定義View簡介 - onMeasure,onDraw,自定義屬性