android自定義view基礎(chǔ)

該文章筆記代碼是從慕課網(wǎng)自定義view課程中學(xué)習(xí)到的炕吸,有興趣的同學(xué)可以學(xué)習(xí)一下

我們需要實(shí)現(xiàn)的自定義view的樣式


1508123594281.jpg

看似簡單其實(shí),兩個(gè)button勉痴,一個(gè)textview赫模,但是其實(shí)用自定義都是需要我們在class中挨個(gè)添加的而且,這個(gè)耦合性低蒸矛,更好當(dāng)作一個(gè)應(yīng)用的標(biāo)題工具類進(jìn)行擴(kuò)展

第一步

創(chuàng)建一個(gè)自定義view的視圖瀑罗,我們需要把命名空間需要自己定義的屬性給定義好
1508122866605.jpg
  • 在res/values/文件夾下創(chuàng)建attrs.xml文件,用來自定義屬性
  • 需要聲明 declare-styleable 屬性名,這是我們自定義的一些屬性名,在這里要注意一下format為屬性格式雏掠,reference與color一起定義的話可以引用drawable下的圖片或者十六進(jìn)制的顏色格式斩祭。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Topbar">
        <attr name="title" format="string" />
        <attr name="titleTextSize" format="dimension" />
        <attr name="titleTextColor" format="color" />

        <attr name="leftTextColor" format="color" />
        <attr name="leftBackground" format="reference|color" />
        <attr name="leftText" format="string" />

        <attr name="rightTextColor" format="color" />
        <attr name="rightBackground" format="reference|color" />
        <attr name="rightText" format="string" />
    </declare-styleable>
</resources>

  • 自定義一個(gè)類繼承自RelativeLayout,用相對布局進(jìn)行實(shí)現(xiàn),當(dāng)然線性布局也可以
package com.yinhao.myui;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * Created by yinhao on 2017/10/13.
 */

public class Topbar extends RelativeLayout {

    private Button leftButton, rightButton;
    private TextView tvTitle;

    private int leftTextColor;
    private Drawable leftBackground;
    private String leftText;

    private int rightTextColor;
    private Drawable rightBackground;
    private String rightText;

    private int titleTextColor;
    private float titleTextSize;
    private String title;

    private LayoutParams leftParams, rightParams, titleParams;

    private TopbarClickListener listener;

    public Topbar(Context context) {
        this(context, null);
    }

    public Topbar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Topbar(final Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.Topbar);

        leftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);
        leftBackground = ta.getDrawable(R.styleable.Topbar_leftBackground);
        leftText = ta.getString(R.styleable.Topbar_leftText);

        rightTextColor = ta.getColor(R.styleable.Topbar_rightTextColor, 0);
        rightBackground = ta.getDrawable(R.styleable.Topbar_rightBackground);
        rightText = ta.getString(R.styleable.Topbar_rightText);

        titleTextSize = ta.getDimension(R.styleable.Topbar_titleTextSize, 0);
        titleTextColor = ta.getColor(R.styleable.Topbar_titleTextColor, 0);
        title = ta.getString(R.styleable.Topbar_title);

        ta.recycle();//回收乡话,避免浪費(fèi)資源摧玫,避免因?yàn)榫彺嬉鸬囊恍╁e(cuò)誤

        leftButton = new Button(context);
        rightButton = new Button(context);
        tvTitle = new TextView(context);

        leftButton.setTextColor(leftTextColor);
        leftButton.setBackground(leftBackground);
        leftButton.setText(leftText);

        rightButton.setTextColor(rightTextColor);
        rightButton.setBackground(rightBackground);
        rightButton.setText(rightText);

        tvTitle.setTextColor(titleTextColor);
        tvTitle.setTextSize(titleTextSize);
        tvTitle.setText(title);
        tvTitle.setGravity(Gravity.CENTER);

        setBackgroundColor(0xfff59563);

        leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
        addView(leftButton, leftParams);

        rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
        addView(rightButton, rightParams);

        titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
        addView(tvTitle, titleParams);

        leftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.leftClick();
            }
        });

        rightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.rightClick();
            }
        });
    }

    public interface TopbarClickListener {
        void leftClick();

        void rightClick();
    }

    public void setOnTopbarClickListener(TopbarClickListener listener) {
        this.listener = listener;
    }
}

  • 我們來分步解釋一下代碼,在我寫的attrs.xml文件中绑青,定義了9個(gè)自定義的屬性诬像,分別是左邊右邊按鈕的名字,背景和文字顏色闸婴。中間是標(biāo)題名稱坏挠,文字大小以及顏色。

  • 我們應(yīng)該如何在類中引用呢邪乍?context類中有一個(gè)方法obtainStyledAttributes降狠,調(diào)用context.obtainStyledAttributes方法返回一個(gè)TypedArray類对竣,我們自定義的屬性集都在這個(gè)類中,參數(shù)是我們開始定義的declare-styleable的name值

  • 接著我們就可以調(diào)用ta.getXXX的方法把每個(gè)單獨(dú)的自定義屬性取出來,這時(shí)候的格式是declare-styleable的name值加上每個(gè)單獨(dú)的自定義的值喊熟。有些參數(shù)為兩個(gè)參數(shù)柏肪,第二個(gè)為默認(rèn)值,我們填0即可芥牌。

  • 接著我們將自定義的button通過一些我們常用的Button或者TextView的一些方法將從TypedArray中取出來的值進(jìn)行綁定烦味。

  • 那么現(xiàn)在還差一步,我們只是定義了顏色壁拉,可是在哪里聲明控件呢谬俄?控件的大小怎么辦,別急弃理,我們一步步來

  • 控制大小和控件所在的位置溃论,我們需要new一個(gè)繼承自RelativeLayout的LayoutParams,通過ViewGroup下的LayoutParams設(shè)置寬高痘昌,接著我們要調(diào)用RelativeLayout下特有的方法钥勋,通過addRule方法這三個(gè)控件相對于布局中的哪個(gè)位置,第二個(gè)參數(shù)為RelativeLayout特有的TRUE值辆苔,并非boolean的那種true值算灸。最后通過addView方法將設(shè)置好的參數(shù)和控件放到咱們的主類里,也就是相對布局里面

  • 如果我們想實(shí)現(xiàn)點(diǎn)擊方法驻啤,我們可以直接寫一個(gè)setOnClickListener內(nèi)置的方法去調(diào)用菲驴,我們也可以一個(gè)接口,通過接口骑冗,我們降低耦合性赊瞬,在以后每個(gè)不同的activity或者fragment中,自己再進(jìn)行修改

  • 最后贼涩,我們就需要在xml中聲明控件了巧涧,把Topbar的全類名復(fù)制下來,這里要留意下遥倦,我們需要自定義一個(gè)命名空間褒侧,不然會(huì)出現(xiàn)找不到屬性名的問題。在這里谊迄,我定義了一個(gè)叫custom的名字。把命名空間最后一個(gè)android改成res-auto,如果你用的是eclipse開發(fā)項(xiàng)目烟央,可以使用Topbar的全類名统诺。

WechatIMG216.jpeg

這樣,我們定義的自定義標(biāo)頭就算是完成了疑俭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粮呢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啄寡,老刑警劉巖豪硅,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挺物,居然都是意外死亡懒浮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門识藤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砚著,“玉大人,你說我怎么就攤上這事痴昧』拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵赶撰,是天一觀的道長舌镶。 經(jīng)常有香客問我,道長豪娜,這世上最難降的妖魔是什么餐胀? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侵歇,結(jié)果婚禮上骂澄,老公的妹妹穿的比我還像新娘。我一直安慰自己惕虑,他們只是感情好坟冲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溃蔫,像睡著了一般健提。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伟叛,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天私痹,我揣著相機(jī)與錄音,去河邊找鬼统刮。 笑死紊遵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侥蒙。 我是一名探鬼主播暗膜,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鞭衩!你這毒婦竟也來了学搜?” 一聲冷哼從身側(cè)響起娃善,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑞佩,沒想到半個(gè)月后聚磺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炬丸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年瘫寝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御雕。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矢沿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酸纲,到底是詐尸還是另有隱情捣鲸,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布闽坡,位于F島的核電站栽惶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疾嗅。R本人自食惡果不足惜外厂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望代承。 院中可真熱鬧汁蝶,春花似錦、人聲如沸论悴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膀估。三九已至幔亥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間察纯,已是汗流浹背帕棉。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饼记,地道東北人香伴。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像具则,于是被迫代替她去往敵國和親瞒窒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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