自定義 View 和自定義屬性的常規(guī)步驟

前言

本篇主要記錄的是自定義 View 和自定義屬性的流程

正文

一溜在、自定義 View 的步驟

  • 第一步,創(chuàng)建一個類繼承自需要的 View 或 ViewGroup,重寫構(gòu)造方法

  • 第二步昆雀,重寫 onMeasure() 方法辱志,測量控件的大小,并指定大小狞膘,指定大小的方法為:

  setMeasuredDimension(200,100);
  • 第三步荸频,重寫 onLayout() 方法,指定該控件在父控件中的位置客冈,但是此方法是系統(tǒng)調(diào)用的,告訴我們我們的控件在父控件什么位置稳强,一般在自定義 ViewGroup 中用的比較多场仲。

  • 第四步,重寫 onDraw() 方法退疫,繪制自己需要的圖案渠缕,但是大部分的自定義控件都是繪制圖片

  • 第五步,重寫 onTouchEvent() 方法褒繁,處理觸摸事件亦鳞,在這一步容易出現(xiàn)點擊事件和滑動事件的沖突,原因是因為棒坏,系統(tǒng)默認只要發(fā)生了 up 事件燕差,就會執(zhí)行點擊事件的邏輯。處理完事件之后坝冕,一般需要重新繪制 View徒探,方法如下

invalidate() //刷新 View ,會重新調(diào)用 onDraw() 方法喂窟,在主線程中調(diào)用

postInvalidate() //與上邊方法的區(qū)別在于测暗,在子線程中調(diào)用
  • onSizeChanged() 方法
    /**
     * 在view第一次被指定了大小值、或者view的大小發(fā)生改變時會被調(diào)用磨澡。
     * 所以一般用來計算一些位置和與view的size有關(guān)的值碗啄。
     *
     * @param w    最終的寬度
     * @param h    最終的高度
     * @param oldw 上次的寬度
     * @param oldh 上次的高度
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

    }

二、自定義屬性

作用: 為自定義控件添加屬性稳摄,增強其復(fù)用性稚字,比如說羡藐,我寫一個自定義控件的背景是固定死的驱入,想要換顏色的話就通過自定義屬性來設(shè)置。

步驟:

  • 首先先思考下捧存,系統(tǒng)中的控件的屬性是怎么生效的弃锐, 我們仿照系統(tǒng)的方式來來設(shè)置即可袄友,而系統(tǒng)控件的屬性在
    E:\androidStudioSDK\platforms\android-14\data\res\values 目錄下的 attrs.xml 文件中

  • 比如說,我們現(xiàn)在的需求是霹菊,給一個自定義的按鈕設(shè)置一個背景屬性剧蚣,使其能夠隨便切換背景

2.1 第一步支竹,聲明屬性,即:在 values 文件夾下創(chuàng)建一個 attrs.xml 文件鸠按,名稱可以隨意礼搁,不一定非得是 attrs ,然后編輯該文件
  • 聲明一個屬性集合目尖,名字一般跟自定義控件的名字一致
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--聲明一個屬性集合馒吴,名字一般跟自定義控件的名字一致,這個名字在后邊會用到-->
    <declare-styleable name="Mybtn">


    </declare-styleable>

</resources>
  • 聲明背景屬性
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--聲明一個屬性集合瑟曲,名字一般跟自定義控件的名字一致-->
    <declare-styleable name="MyView">
        <!--聲明背景屬性饮戳,format 表示類型為引用圖片類型-->
        <attr name="btnBg" format="reference|color" />

    </declare-styleable>

</resources>
2.2 第二步,在布局文件中使用屬性
  • 聲明一個命名空間洞拨,類似于系統(tǒng)中的控件扯罐,如:
 xmlns:android="http://schemas.android.com/apk/res/android"

其中 xmlns 表示命名空間的意思,android 只是一個名字烦衣,只不過這個名字被系統(tǒng)定義好了

而我們聲明的時候歹河,也類似于這種格式:

    xmlns:zhangsan="http://schemas.android.com/apk/res-auto"

其中,zhangsan 是我們隨意命名的花吟,eclipse 中是把最后的 android 換成包名秸歧,而 AndroidStudio 中是換成 res-auto

  • 在自定義控件中使用自定義屬性
 zhangsan:btnBg="@mipmap/ic_launcher"

其中,zahngsan 是我們命名空間的名字衅澈,btnBg 是我們聲明的屬性寥茫,跟系統(tǒng)的 android:XXX 是一樣的

2.3 在自定義控件中獲得布局文件中聲明的屬性,使其生效矾麻!
  • 主要操作的是自定義控件中兩個屬性的構(gòu)造方法:
    /**
     *
     * @param context
     * @param attrs 在布局中聲明的所有屬性
     */
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
  • 具體操作如下:
    /**
     *
     * @param context
     * @param attrs 在布局中聲明的所有屬性
     */
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        // R.styleable.MyView 就是我們在 attrs.xml 文件中聲明的屬性集合
        //根據(jù)基本的屬性集合纱耻,獲得一個各個類型的數(shù)組
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyView);
        // R.styleable.MyView_btnBg 是由系統(tǒng)生成的 屬性集合_屬性名稱
        //獲取到的就是我們設(shè)置的圖片資源
        BitmapDrawable bitmapDrawable = (BitmapDrawable) typedArray.getDrawable(R.styleable.MyView_btnBg);
        //將之前的圖片替換成設(shè)置的即可,在 onDraw 方法中通過 drawXXX 方法繪畫出來
        Bitmap bitmap = bitmapDrawable.getBitmap();
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末险耀,一起剝皮案震驚了整個濱河市弄喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甩牺,老刑警劉巖蘑志,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贬派,居然都是意外死亡急但,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門搞乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來波桩,“玉大人,你說我怎么就攤上這事请敦「涠悖” “怎么了储玫?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萤皂。 經(jīng)常有香客問我撒穷,道長,這世上最難降的妖魔是什么裆熙? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任端礼,我火速辦了婚禮,結(jié)果婚禮上入录,老公的妹妹穿的比我還像新娘蛤奥。我一直安慰自己,他們只是感情好纷跛,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邀杏,像睡著了一般贫奠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上望蜡,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天唤崭,我揣著相機與錄音,去河邊找鬼脖律。 笑死谢肾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的小泉。 我是一名探鬼主播芦疏,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼微姊!你這毒婦竟也來了酸茴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兢交,失蹤者是張志新(化名)和其女友劉穎薪捍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配喳,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡酪穿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴裹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被济。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涧团,靈堂內(nèi)的尸體忽然破棺而出溉潭,到底是詐尸還是另有隱情净响,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布喳瓣,位于F島的核電站馋贤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畏陕。R本人自食惡果不足惜配乓,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠毁。 院中可真熱鬧犹芹,春花似錦、人聲如沸鞠绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈膨。三九已至屿笼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁巍,已是汗流浹背驴一。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶壶,地道東北人肝断。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像驰凛,于是被迫代替她去往敵國和親胸懈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容