通用ToolBar

android開發(fā)中toolbar標配的控件,之前一直寫布局來安排里面文字和圖片,雖然不難但確實麻煩理盆,今天自己弄了一個通用的控件,大家分享一下凑阶≡彻妫看圖


圖.png

下面看代碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="zhoufazhan.com.customtoolbar.MainActivity">

    <zhoufazhan.com.customtoolbar.CustomToolBar
        android:id="@+id/customToolbar"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:leftImage="@drawable/ic_arrow_back_white_24dp"
        app:leftText="返回"
        app:leftTextColor="@color/white"
        app:middleText="標題"
        app:middleTextColor="@color/white"
        app:rightText="更多"
        app:rightTextColor="@color/white" />
</LinearLayout>

簡單地不得了,所有的參數(shù)都寫在一個控件里面宙橱,再也不用嵌套和布局了姨俩,里面還實現(xiàn)了按鈕的點擊實現(xiàn)。

接下來介紹一下我是如何實現(xiàn)的
首先toolbar分為3塊區(qū)域师郑,左中右
左邊:圖片加文字环葵,當然也可以單獨圖片或是單獨文字(這里沒有給出圖片)
中間:文字
右邊:文字,也可以是文字加圖片宝冕,也可以是單獨的圖片张遭,與左邊一樣
那么圖片加文字是如何排版的呢,我們知道TextView有一個屬性drawLeft和drawRight等

ToolBar的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@color/colorPrimary"
    android:layout_height="50dp">

    <TextView
        android:id="@+id/left"
        android:padding="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:gravity="center"
        />

    <TextView
        android:id="@+id/middle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"

        />

    <TextView
        android:id="@+id/right"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        />

</RelativeLayout>

超級簡單地梨,就是三個TextView

接下來就是重點了帝璧,自定義CustomToolBar

使用的布局文件就是上面的
自定義控件的第一步就是分析屬性,這里我們要設置湿刽,文字、圖片褐耳、文字的大小诈闺、文字的顏色等。

<resources>
    <declare-styleable name="CustomToolBar">
        <attr name="leftText" format="string" />
        <attr name="middleText" format="string" />
        <attr name="rightText" format="string" />
        <attr name="leftTextSize" format="dimension" />
        <attr name="middleTextSize" format="dimension" />
        <attr name="rightTextSize" format="dimension" />
        <attr name="leftTextColor" format="color" />
        <attr name="middleTextColor" format="color" />
        <attr name="rightTextColor" format="color" />
        <attr name="leftImage" format="reference"/>
        <attr name="rightImage" format="reference"/>
    </declare-styleable>
</resources>

具體的含義已經(jīng)很明確就不解釋了铃芦。
下面看看主要的代碼

public class CustomToolBar  extends RelativeLayout implements View.OnClickListener {
    private float leftTextSize;
    private float middleTextSize;
    private float rightTextSize;
    private int leftTextColor;
    private int middleTextColor;
    private int rightTextColor;
    private String leftText;
    private String middleText;
    private String rightText;
    private int leftImage;
    private int rightImage;
    private TextView leftView;
    private TextView middleView;
    private TextView rightView;

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

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

    public CustomToolBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomToolBar, defStyleAttr, 0);

        initView(typedArray);
        typedArray.recycle();

    }

    public void initView(TypedArray typedArray) {
        LayoutInflater.from(getContext()).inflate(R.layout.toolbar, this);
        leftView = (TextView) findViewById(R.id.left);
        leftView.setOnClickListener(this);
        middleView = (TextView) findViewById(R.id.middle);
        rightView = (TextView) findViewById(R.id.right);
        rightView.setOnClickListener(this);
        leftText = typedArray.getString(R.styleable.CustomToolBar_leftText);
        rightText = typedArray.getString(R.styleable.CustomToolBar_rightText);
        middleText = typedArray.getString(R.styleable.CustomToolBar_middleText);
        leftTextSize = typedArray.getDimension(R.styleable.CustomToolBar_leftTextSize, 20);

        middleTextSize = typedArray.getDimension(R.styleable.CustomToolBar_middleTextSize, 20);
        rightTextSize = typedArray.getDimension(R.styleable.CustomToolBar_rightTextSize, 20);

        leftTextColor = typedArray.getColor(R.styleable.CustomToolBar_leftTextColor, getResources().getColor(R.color.colorPrimary));
        middleTextColor = typedArray.getColor(R.styleable.CustomToolBar_middleTextColor, getResources().getColor(R.color.colorPrimary));
        rightTextColor = typedArray.getColor(R.styleable.CustomToolBar_rightTextColor, getResources().getColor(R.color.colorPrimary));

        leftImage = typedArray.getResourceId(R.styleable.CustomToolBar_leftImage, 0);
        rightImage = typedArray.getResourceId(R.styleable.CustomToolBar_rightImage, 0);

        if (leftImage > 0) {
            setLeftImage(leftImage);
        } else {
            setLeftText(leftText);
        }
        if (rightImage > 0) {
            setRightImage(rightImage);
        } else {
            setRightText(rightText);
        }
        setLeftTextSize(leftTextSize);
        setLeftTextColor(leftTextColor);
        setMiddleTextColor(middleTextColor);
        setMiddleTextSize(middleTextSize);
        setMiddleText(middleText);
        setRightTextColor(rightTextColor);
        setRightTextSize(rightTextSize);
    }


    public CustomToolBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.left:
                if (toolBarClick != null) {
                    toolBarClick.leftClick();
                }
                break;
            case R.id.right:
                if (toolBarClick != null) {
                    toolBarClick.rightClick();
                }
                break;
        }
    }

    public void setLeftTextSize(float leftTextSize) {
        leftView.setTextSize(leftTextSize);
    }

    public void setMiddleTextSize(float middleTextSize) {
        middleView.setTextSize(middleTextSize);
    }

    public void setRightTextSize(float rightTextSize) {
        rightView.setTextSize(rightTextSize);
    }

    public void setLeftTextColor(int leftTextColor) {
        leftView.setTextColor(leftTextColor);
    }

    public void setMiddleTextColor(int middleTextColor) {
        middleView.setTextColor(middleTextColor);
    }

    public void setRightTextColor(int rightTextColor) {
        rightView.setTextColor(rightTextColor);
    }

    public void setLeftText(String leftText) {
        leftView.setText(leftText);
    }

    public void setMiddleText(String middleText) {
        middleView.setText(middleText);
    }

    public void setRightText(String rightText) {
        rightView.setText(rightText);
    }

    public void setLeftImage(int leftImage) {
        setLeftText(leftText);
        Drawable drawable = getResources().getDrawable(leftImage, null);
        drawable.setBounds(0, 0, drawable.getMinimumWidth() / 2, drawable.getMinimumHeight() / 2);
        leftView.setCompoundDrawables(drawable, null, null, null);
    }

    public void setRightImage(int rightImage) {
        setRightText(rightText);
        Drawable drawable = getResources().getDrawable(rightImage, null);
        drawable.setBounds(0, 0, drawable.getMinimumWidth() / 2, drawable.getMinimumHeight() / 2);
        rightView.setCompoundDrawables(null, null, drawable, null);
    }

    interface ToolBarClick {
        void leftClick();

        void rightClick();
    }

    public ToolBarClick toolBarClick;

    public void setToolBarClick(ToolBarClick toolBarClick) {
        this.toolBarClick = toolBarClick;
    }
}

代碼不多雅镊,也很簡單,基本都是初始化一些參數(shù)刃滓,然后定義了一個接口用于點擊回調(diào)仁烹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咧虎,隨后出現(xiàn)的幾起案子卓缰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征唬,死亡現(xiàn)場離奇詭異捌显,居然都是意外死亡,警方通過查閱死者的電腦和手機总寒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門扶歪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摄闸,你說我怎么就攤上這事善镰。” “怎么了年枕?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵炫欺,是天一觀的道長。 經(jīng)常有香客問我画切,道長竣稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任霍弹,我火速辦了婚禮毫别,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘典格。我一直安慰自己岛宦,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布耍缴。 她就那樣靜靜地躺著砾肺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪防嗡。 梳的紋絲不亂的頭發(fā)上变汪,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音蚁趁,去河邊找鬼裙盾。 笑死,一個胖子當著我的面吹牛他嫡,可吹牛的內(nèi)容都是我干的番官。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼钢属,長吁一口氣:“原來是場噩夢啊……” “哼徘熔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆党,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤酷师,失蹤者是張志新(化名)和其女友劉穎讶凉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窒升,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡缀遍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饱须。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片域醇。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓉媳,靈堂內(nèi)的尸體忽然破棺而出譬挚,到底是詐尸還是另有隱情,我是刑警寧澤酪呻,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布减宣,位于F島的核電站,受9級特大地震影響玩荠,放射性物質(zhì)發(fā)生泄漏漆腌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一阶冈、第九天 我趴在偏房一處隱蔽的房頂上張望闷尿。 院中可真熱鬧,春花似錦女坑、人聲如沸填具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳景。三九已至,卻和暖如春碉就,著一層夾襖步出監(jiān)牢的瞬間盟广,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工瓮钥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筋量,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓骏庸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年叮。 傳聞我的和親對象是個殘疾皇子具被,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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