Android 圖解創(chuàng)建外部 lib 庫及自定義登錄按鈕

??????隨著插件化/組件化的快速發(fā)展,現(xiàn)在大部分的項目開發(fā)中都會提取公共的代碼制作成 Library module钠绍,根據(jù)具體的業(yè)務需求進行拆分帽哑。小菜也學習一下如何拆分 lib 包溯祸,實際操作很簡單,整理一下操作步驟本姥。

拆分創(chuàng)建 Library

  1. 在當前 Project 下肩袍,File -> New Module,選擇 Android Library,進行下一步婚惫;
  1. 設置具體的 Library/Module/Package 等名稱氛赐,注意:Module 名稱與 Library 相匹配默認為小寫魂爪,需要的話手動調(diào)整,進行下一步艰管;
  1. 此時在當前 Project 中就已經(jīng)創(chuàng)建好 Library滓侍;
  1. 在當前 Projectsettings.gradle 中就會自動生成創(chuàng)建的 Module

Tips: :myview 中的 : 代表的與 app 同級目錄下的 Module牲芋。

  1. 在當前 appbuild.gradledependencies{} 中添加 implementation project(':myview') 即可正常接入粗井。

自定義 View

??????小菜在新建的 Library 中添加一個自定義按鈕,可以添加配置圖標和文字以及背景樣式街图。因為只是為了測試 Library Module浇衬,所以功能很簡單,實現(xiàn)方式也很簡單餐济,只是幾個基本控件的組合耘擂。小菜只是簡單的整理一下。

  1. 新建一個 MyView 繼承自 RelativeLayout絮姆,實現(xiàn)基本的構(gòu)造方法醉冤;
  2. 在構(gòu)造方法中實現(xiàn)對布局的添加,控件的綁定以及一些基本的 setXX 方法篙悯;
  3. 至此 MyView 就可以應用蚁阳,但所有但屬性都需要通過 setXX 方法來設置;這當然是不合理的鸽照,于是小菜新建一個 attrs 文件螺捐,在資源文件中設置基本的樣式,并在 MyViewobtainAttributes 方法中逐一綁定即可矮燎;
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
    <declare-styleable name="my_view" tools:ignore="MissingDefaultResource">
        <!-- 中間文字顏色 -->
        <attr name="tv_color" format="color" />
        <!-- 中間文字顯隱性 -->
        <attr name="tv_show" format="boolean" />
        <!-- 中間文字內(nèi)容 -->
        <attr name="tv_str" format="string" />
        <!-- 中間文字大小 -->
        <attr name="tv_size" format="float" />
        <!-- 右側(cè)文字顏色 -->
        <attr name="right_tv_color" format="color" />
        <!-- 右側(cè)文字顯隱性 -->
        <attr name="right_tv_show" format="boolean" />
        <!-- 右側(cè)文字內(nèi)容 -->
        <attr name="right_tv_str" format="string" />
        <!-- 右側(cè)文字大小 -->
        <attr name="right_tv_size" format="float" />
        <!-- 整體背景顏色 -->
        <attr name="bg_color" format="color" />
        <!-- 整體邊框顏色 -->
        <attr name="strok_color" format="color" />
        <!-- 整體邊框圓角 -->
        <attr name="bg_radius" format="float" />
        <!-- 中間圖片顯隱性 -->
        <attr name="iv_show" format="boolean" />
        <!-- 中間圖片資源 -->
        <attr name="iv_src" format="reference" />
    </declare-styleable>
</resources>
  1. 至此定血,MyView 自定義按鈕以及完成,在 app 中也是正常調(diào)用即可诞外。
public class MyView extends RelativeLayout {

    private Context mContext;
    private RelativeLayout mRlay;
    private ImageView mIv;
    private TextView mTv, mRightTv;
    GradientDrawable drawable = new GradientDrawable();

    int mTvColor, mRightTvColor, mRlayBgColor, mStrokeColor, mIvSrc;
    boolean isTvShow, isRightTvShow, isIvShow;
    float mTvSize, mRightTvSize, mRadiusSize;
    String mTvStr, mRightTvStr;

    public MyView(Context context) {
        super(context);
        mContext = context;
        initView();
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        initView();
        obtainAttributes(context,attrs);
    }

    private void initView() {
        LayoutInflater.from(mContext).inflate(R.layout.my_view_btn, this,true);
        mRlay = findViewById(R.id.my_view_rly);
        mIv = findViewById(R.id.my_view_iv);
        mTv = findViewById(R.id.my_view_tv);
        mRightTv = findViewById(R.id.my_view_rtv);
    }

    private void obtainAttributes(Context context, AttributeSet attrs) {
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.my_view);

        mTvColor = ta.getColor(R.styleable.my_view_tv_color, Color.BLACK);
        mTv.setTextColor(mTvColor);
        mRightTvColor = ta.getColor(R.styleable.my_view_right_tv_color, Color.BLACK);
        mRightTv.setTextColor(mRightTvColor);
        mRlayBgColor = ta.getColor(R.styleable.my_view_bg_color, Color.WHITE);
        mRlay.setBackgroundColor(mRlayBgColor);
        mStrokeColor = ta.getColor(R.styleable.my_view_strok_color, Color.BLACK);
        isIvShow = ta.getBoolean(R.styleable.my_view_iv_show, true);
        mIv.setVisibility(isIvShow?View.VISIBLE:View.GONE);
        isRightTvShow = ta.getBoolean(R.styleable.my_view_right_tv_show, true);
        mRightTv.setVisibility(isRightTvShow?View.VISIBLE:View.GONE);
        isTvShow = ta.getBoolean(R.styleable.my_view_tv_show, true);
        mTv.setVisibility(isTvShow?View.VISIBLE:View.GONE);
        mTvSize = ta.getFloat(R.styleable.my_view_tv_size, 16.0f);
        mTv.setTextSize(mTvSize);
        mRightTvSize = ta.getFloat(R.styleable.my_view_right_tv_size, 14.0f);
        mRightTv.setTextSize(mRightTvSize);
        mRadiusSize = ta.getFloat(R.styleable.my_view_bg_color, 80.0f);
        drawable = (GradientDrawable) getResources().getDrawable(R.drawable.user_login_corner_qq);
        drawable.setCornerRadius(mRadiusSize);
        drawable.setStroke(1, mStrokeColor);
        drawable.setColor(mRlayBgColor);
        mRlay.setBackground(drawable);
        mTvStr = ta.getString(R.styleable.my_view_tv_str);
        mTv.setText(mTvStr);
        mRightTvStr = ta.getString(R.styleable.my_view_right_tv_str);
        mRightTv.setText(mRightTvStr);
        mIvSrc = ta.getResourceId(R.styleable.my_view_iv_src, R.mipmap.user_login_icon_qq);
        mIv.setImageResource(mIvSrc);

        ta.recycle();
    }

    public void setMyViewTv(String textStr) {
        mTv.setText(textStr);
    }

    public void setMyViewTvColor(int color) {
        mTv.setTextColor(color);
    }

    public void setMyViewTvSize(float size) {
        mTv.setTextSize(size);
    }

    public void isMyViewTvShow(boolean state) {
        mTv.setVisibility(state ? View.VISIBLE : View.GONE);
    }

    public void setMyViewIv(Drawable drawable) {
        mIv.setImageDrawable(drawable);
    }

    public void isMyViewIvShow(boolean state) {
        mIv.setVisibility(state ? View.VISIBLE : View.GONE);
    }

    public void isMyViewRightTvShow(boolean state) {
        mRightTv.setVisibility(state ? View.VISIBLE : View.GONE);
    }

    public void setMyViewRightTvText(String textStr) {
        mRightTv.setText(textStr);
    }

    public void setMyViewRightTvSize(float size) {
        mRightTv.setTextSize(size);
    }

    public void setMyViewRightTvColor(int color) {
        mRightTv.setTextColor(color);
    }

    public void setMyViewBgColor(int color) {
        drawable.setColor(color);
        mRlay.setBackground(drawable);
    }

    public void setMyViewBgRadius(float radius) {
        drawable.setCornerRadius(radius);
        mRlay.setBackground(drawable);
    }

    public void setMyViewBgStrokeColor(int color) {
        drawable.setStroke(1, color);
        mRlay.setBackground(drawable);
    }

    public void setMyViewBgDrawable(Drawable drawable) {
        mRlay.setBackground(drawable);
    }
}

??????Tips: attrs.xml 中如果需要用到資源文件澜沟,可以使用 format="reference",代表某一個資源ID峡谊。


??????小菜也是初步嘗試茫虽,有不對的地方煩請?zhí)嵝选?/p>

來源: 阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市既们,隨后出現(xiàn)的幾起案子濒析,更是在濱河造成了極大的恐慌,老刑警劉巖贤壁,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼枢,死亡現(xiàn)場離奇詭異,居然都是意外死亡脾拆,警方通過查閱死者的電腦和手機馒索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來名船,“玉大人绰上,你說我怎么就攤上這事∏眨” “怎么了蜈块?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迷扇。 經(jīng)常有香客問我百揭,道長,這世上最難降的妖魔是什么蜓席? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任器一,我火速辦了婚禮,結(jié)果婚禮上厨内,老公的妹妹穿的比我還像新娘祈秕。我一直安慰自己,他們只是感情好雏胃,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布请毛。 她就那樣靜靜地躺著,像睡著了一般瞭亮。 火紅的嫁衣襯著肌膚如雪方仿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天统翩,我揣著相機與錄音兼丰,去河邊找鬼。 笑死唆缴,一個胖子當著我的面吹牛鳍征,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播面徽,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼艳丛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趟紊?” 一聲冷哼從身側(cè)響起氮双,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霎匈,沒想到半個月后戴差,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铛嘱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年暖释,在試婚紗的時候發(fā)現(xiàn)自己被綠了袭厂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡球匕,死狀恐怖纹磺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亮曹,我是刑警寧澤橄杨,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站照卦,受9級特大地震影響式矫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜役耕,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一采转、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹄葱,春花似錦氏义、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竣况,卻和暖如春克婶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丹泉。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工情萤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摹恨。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓筋岛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晒哄。 傳聞我的和親對象是個殘疾皇子睁宰,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

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

  • Android中View自定義XML屬性詳解以及R.attr與R.styleable的區(qū)別 Android中的各種...
    毹毹閱讀 7,697評論 0 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,806評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料寝凌? 從這篇文章中你...
    hw1212閱讀 12,700評論 2 59
  • 6月7日精進:最近氣溫比較高柒傻,家人們干活的時候要注意防暑。店里也要準備一些應急的藥品了较木。
    京心達畢玉娜閱讀 118評論 0 0
  • 你說你喜歡雨红符,可是下雨的時候你卻撐起了傘,他的兄弟雪看不下去想要教訓教訓你,可是雨卻說你怕冷經(jīng)受不起突如其來的凜冽...
    流落與歸宿閱讀 505評論 5 2