SuperTextView 万能android布局工具类

1、功能描述

你还在为类似设置页面的样式(图+文字+图)每次写一大堆布局文件而烦恼吗?快来看看SuperTextView吧,这里有你想要实现的任何样式,而你要做的仅仅是引入几行代码。SuperTextView是一个功能强大的布局View,可以满足日常大部分布局样式,开发者可以自行组合属性配置出属于自己风格的样式!可能描述起来没有概念,还是直接看效果图吧!

2、 效果图


image

3、如何使用

Android Studio导入方法,添加Gradle依赖

 先在项目根目录的 build.gradle 的 repositories 添加:
 allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

然后在dependencies添加:

 dependencies {
    ...
    compile 'com.github.lygttpod:SuperTextView:2.0.1'
    }

3.2、项目中如何使用
3.2.1、布局中如何使用(示例中只列出部分属性,开发者可根据具体需求使用其他属性)

<com.allen.supertextviewlibrary.SuperTextView
            android:id="@+id/super_tv"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            stv:sLeftBottomTextColor2="@color/colorAccent"
            stv:sLeftBottomTextString="招商银行(8888)"
            stv:sLeftBottomTextString2="限额说明>>"
            stv:sLeftIconRes="@drawable/bank_zhao_shang"
            stv:sLeftTopTextString="银行卡支付"
            stv:sRightCheckBoxRes="@drawable/circular_check_bg"
            stv:sRightCheckBoxShow="true"
            stv:sLineShow="bottom"
             />
    注意:
            1、上下的线可以通过   sLineShow 设置  有四种显示方式 none,top,bottom,both
            2、通过设置 sUseRipple=true 开启水波效果

3.2.2、代码中如何使用

/**
 * 可以通过链式设置大部分常用的属性值
 */
    superTextView.setLeftIcon(drawable)
            .setLeftString("")
            .setLeftTVColor(0)
            .setLeftTopString("")
            .setLeftTopTVColor(0)
            .setLeftBottomString("")
            .setLeftBottomTVColor(0)
            .setLeftBottomString2("")
            .setLeftBottomTVColor2(0)
            .setRightString("")
            .setRightTVColor(0)
            .setCbChecked(true)
            .setCbBackground(drawable)
            .setRightIcon(drawable)
            .setRightString("")
            .setRightTVColor(0)
            .setLeftString("")

点击事件(可根据需求选择实现单个或者多个点击事件,需要配合xml添加是否允许点击的属性,详情见属性参数的意义)

   superTextView.setOnSuperTextViewClickListener(new SuperTextView.OnSuperTextViewClickListener() {
                @Override
                public void onSuperTextViewClick() {
                    super.onSuperTextViewClick();
                    //do something
                }

                @Override
                public void onLeftTopClick() {
                    super.onLeftTopClick();
                    //do something
                }

                @Override
                public void onLeftBottomClick() {
                    super.onLeftBottomClick();
                    //do something
                }

                @Override
                public void onLeftBottomClick2() {
                    super.onLeftBottomClick2();
                    //do something
                }
            });

            注意:点击事件需要配合属性值使用
            sLeftTopViewIsClickable= true
            sLeftBottomViewIsClickable= true
            sLeftBottomView2IsClickable= true

使用第三方库(Picasso或者Glide)加载网络图片

     Picasso.with(this)
     .load(url)
     .placeholder(R.drawable.head_default)
     .into((ImageView) superTextView.getView(SuperTextView.leftImageViewId));

3.2.3、属性说明(以下属性全部可以通过xml文件配置和代码进行设置)

360截图20190427145652016.jpg

4、实现原理
4.1、需求分析

黑格尔曾说过:存在即合理。SuperTextView的出现应该就是某种需求下的产物。

在开发项目的过程中你会发现有很多页面的布局都是类似的,就比如说常见的设置页面,基本上都是图标+文字+图标的格式,而且出现的频率都很高,如果不做处理势必会写很多无用的代码降低开发效率,正因为如此我们为什么不把这一类view统一封装起来呐(其实就是程序猿的懒惰,哈哈),有了这个想法就开始调研市场上主流应用的显示样式,经过调研总结出一套显示方案涵盖了市面上90%以上的布局样式,目的是在以后的使用中快速高效的开发。

首先SuperTextView 是继承自 RelativeLayout实现,里边所有布局的添加都是通过Java代码实现的,事先定义好需要的参数名及类型

下边只列出部分参数

private int backgroundColor;//背景颜色
private int leftTVColor;//左边文字颜色
private int leftTopTVColor;//左上文字颜色
private int leftBottomTVColor;//左下文字颜色
private int leftBottomTVColor2;//左下第二个文字颜色
private int rightTVColor;//右边文字颜色
private int centerTVColor;//中间文字颜色

private boolean isSingLines = true;//是否单行显示   默认单行
private int maxLines = 1;//最多几行    默认显示一行
private int maxEms = 10;//最多几个字    默认显示10个汉子

private static final int NONE = 0;
private static final int TOP = 1;
private static final int BOTTOM = 2;
private static final int BOTH = 3;
private static final int DEFAULT = BOTTOM;

然后就是在构造方法里边去实现各个方法

public SuperTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    getAttr(attrs);
    initLayout();
}

我们知道系统控件可以从XML中拿到定义好的属性值,那么我们其实也是可以的,首先在attr中定义好相关属性名及字段类型然后通过AttributeSet去拿到相关属性值在进行设置

private void getAttr(AttributeSet attrs) {
    //获取我们在attr中定义的SuperTextView相关属性
    TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.SuperTextView);

    //下边展示的各个类型参数的获取方法,drawable、string、boolean、int、px
    leftIconRes = typedArray.getDrawable(R.styleable.SuperTextView_sLeftIconRes);
    leftTextString = typedArray.getString(R.styleable.SuperTextView_sLeftTextString);
    showCheckBox = typedArray.getBoolean(R.styleable.SuperTextView_sRightCheckBoxShow, false);
    lineType = typedArray.getInt(R.styleable.SuperTextView_sLineShow, DEFAULT);
    topLineMargin = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sTopLineMargin, defaultLinePadding);

    //获取完之后记得recycle()释放掉资源
    typedArray.recycle();
  }

接下来就拿一个view为例进行说明如何动态添加view及设置相关属性

/**
 * 初始化左边文字
 */
private void initLeftText() {
    leftTV = new TextView(mContext);
    leftTextParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    leftTextParams.addRule(RelativeLayout.CENTER_VERTICAL, TRUE);
    leftTextParams.addRule(RelativeLayout.RIGHT_OF, R.id.sLeftIconId);
    setMargin(leftTextParams, leftTVMarginLeft, 0, dip2px(mContext, 10), 0);
    leftTV.setId(R.id.sLeftTextId);
    leftTV.setLayoutParams(leftTextParams);
    leftTV.setText(leftTextString);
    //设置Params的方法抽离出来便于以后统一调用
    setTextViewParams(leftTV, isSingLines, maxLines, maxEms);
    //设置字体颜色的方法抽离出来便于以后统一调用
    setTextColor(leftTV, leftTVColor);
    //设置字体大小的方法抽离出来便于以后统一调用
    setTextSize(leftTV, leftTVSize);
    //调用addView方法把我们动态创建的view添加到布局中
    addView(leftTV);
}

初始化完view之后就是要暴露一些方法供外部人员使用了(部分代码示例)
在这里我们返回SuperTextView对象是为了实现链式调用

  /**
 * 获取checkbox状态
 *
 * @return 返回选择框当前选中状态
 */

 public boolean getCbisChecked() {
    boolean isChecked = false;
    if (rightCheckBox != null) {
        isChecked = rightCheckBox.isChecked();
    }
    return isChecked;
}

/**
 * 设置左边文字的颜色
 *
 * @param textColor 文字颜色值
 * @return 返回对象
 */
public SuperTextView setLeftTVColor(int textColor) {
    leftTVColor = textColor;
    if (leftTV == null) {
        initLeftText();
    } else {
        leftTV.setTextColor(textColor);
    }
    return this;
}

最后就是一些回调方法的使用,以点击事件为例
/**
* 点击事件接口
* 这里没有使用interface是因为有些方法我们不是一定要实现的
* 用到哪个方法再去重写方法就可以了
*/

   public static class OnSuperTextViewClickListener {
    public void onSuperTextViewClick() {
    }

    public void onLeftTopClick() {
    }

    public void onLeftBottomClick() {
    }

    public void onLeftBottomClick2() {
    }

}

相关的set方法拿到OnSuperTextViewClickListener对象

public SuperTextView setOnSuperTextViewClickListener(OnSuperTextViewClickListener listener) {
    onSuperTextViewClickListener = listener;
    return this;
}

初始化view的时候在各个view的点击事件中添加相应的回调方法就行了

 if (mLeftTopViewIsClickable) {
        leftTopTV.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onSuperTextViewClickListener != null) {
                    onSuperTextViewClickListener.onLeftTopClick();
                }
            }
        });
    }

以上只是源码中的部分方法拿出来供分析使用,看了之后是不是感觉实现其实很简单,赶紧自己着手实现一个吧!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 文章目录 1、功能描述 2、效果图 3、如何使用3.1、 Android Studio导入方法3.2、 项目中如何...
    lygttpod阅读 15,714评论 28 165
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,090评论 1 32
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,365评论 0 17
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,734评论 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,447评论 1 45