Android 自定義View簡介

概述

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仅颇,構造方法的調用


image.png

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,自定義屬性

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赵颅,隨后出現的幾起案子虽另,更是在濱河造成了極大的恐慌,老刑警劉巖饺谬,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂刺,死亡現場離奇詭異,居然都是意外死亡募寨,警方通過查閱死者的電腦和手機族展,發(fā)現死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔鹰,“玉大人仪缸,你說我怎么就攤上這事×兄” “怎么了恰画?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓷马。 經常有香客問我拴还,道長,這世上最難降的妖魔是什么决采? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任自沧,我火速辦了婚禮,結果婚禮上树瞭,老公的妹妹穿的比我還像新娘拇厢。我一直安慰自己,他們只是感情好晒喷,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布孝偎。 她就那樣靜靜地躺著,像睡著了一般凉敲。 火紅的嫁衣襯著肌膚如雪衣盾。 梳的紋絲不亂的頭發(fā)上寺旺,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音势决,去河邊找鬼阻塑。 笑死,一個胖子當著我的面吹牛果复,可吹牛的內容都是我干的陈莽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虽抄,長吁一口氣:“原來是場噩夢啊……” “哼走搁!你這毒婦竟也來了?” 一聲冷哼從身側響起迈窟,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤私植,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后车酣,有當地人在樹林里發(fā)現了一具尸體曲稼,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年湖员,在試婚紗的時候發(fā)現自己被綠了躯肌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡破衔,死狀恐怖,靈堂內的尸體忽然破棺而出钱烟,到底是詐尸還是另有隱情晰筛,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布拴袭,位于F島的核電站读第,受9級特大地震影響,放射性物質發(fā)生泄漏拥刻。R本人自食惡果不足惜怜瞒,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望般哼。 院中可真熱鬧吴汪,春花似錦、人聲如沸蒸眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楞卡。三九已至霜运,卻和暖如春脾歇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淘捡。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工藕各, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焦除。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓激况,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踢京。 傳聞我的和親對象是個殘疾皇子誉碴,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容