自定义控件,一个常用的超级TextView

这里写图片描述

这种布局在开发中特别常见…
所以为了省事,直接写一个自定义一劳永逸解决问题…


1.构建布局

按照布局的规律先创建一个布局…
这里写图片描述

很简单的布局,根据实际需求来即可…


2.创建自定义类

创建类CommonTextItem继承LinearLayout.
看一下LinearLayout的3个构造函数,递归调用,最后调用的都是3参数的构造函数.
我们就把逻辑写在2参数里面好了

 public CommonTextItem(Context context) {
        super(context);
    }

    public CommonTextItem(Context context, AttributeSet attrs) {
        super(context, attrs);
      //TODO....这里写逻辑
    }

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

TIPS:不要盲目的进行递归调用….
ScrollView就是血的教训…感兴趣的可以看看ScrollView的2参数的构造函数.

3.创建declare-styleable

res/values/attrs.xml
没有就创建一个,有就直接

<declare-styleable name="CommonTextItem">
        <attr name="ctiLeftImg" format="reference"/>
        <attr name="ctiRightImg" format="reference"/>
        <attr name="ctiLeftText" format="reference|string"/>
        <attr name="ctiRightText" format="reference|string"/>
        <attr name="ctiLeftTextMargin" format="dimension"/>
        <attr name="ctiRightTextColor" format="color"/>
    </declare-styleable>

左边为自定义的属性名称,右边为该属性的类型
reference: 指定Theme中资源ID。
dimension:尺寸值
float:浮点型
boolean:布尔值
integer:整型
string:字符串
fraction:百分数
flag:位或运算
Color:颜色
enum:枚举

根据个人不同的需求,可以自行修改布局,添加attr属性及对应的类型


4.获取控件

基础布局创建好了,styleable也弄好了,可以开始写逻辑了.
首先肯定是添加布局,根据返回的view,findViewById找到各个组件

View view = LayoutInflater.from(context).inflate(R.layout.widget_common_text, this, true);
iv_left = (ImageView) view.findViewById(R.id.iv_left);
iv_right = (ImageView) view.findViewById(R.id.iv_right);
tv_left = (TextView) view.findViewById(R.id.tv_left);
tv_right = (TextView) view.findViewById(R.id.tv_right);

最关键的时候到了

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CommonTextItem);

拿到这个TypedArray…自定义控件已经完成一半了.


5.写逻辑

使用ta.getResourceId(styleableIndex, defValue);
第一个参数传入在attrs里面创建好的属性名称
第二个参数为该属性的默认值…
比如:

int leftImageR = ta.getResourceId(R.styleable.CommonTextItem_ctiLeftImg, -1);

当该自定义组件在xml配置是 ctiLeftImg没有添加,则默认传入-1.
传入-1干嘛,当然是拿来判断,然后隐藏了

就像这样:

int leftImageR = ta.getResourceId(R.styleable.CommonTextItem_ctiLeftImg, -1);
        if (leftImageR == -1) {
            iv_left.setVisibility(View.GONE);
        } else {
            iv_left.setImageResource(leftImageR);
        }

其他的属性和这个写法一致,传入默认值是隐藏还是设置指定颜色还是默认间距这些 根据个人不同的需求自定义即可.

举个栗子:
1. attrs里面添加字体与图片的间距,属性当然就是dimension了.设置的时候,默认值可以写0啊.只有不为0的设置组件间距即可
2. attrs里面添加字体的颜色,属性当然就是color,设置的时候,默认值可以写 黑色,然后添加判断,不为黑色的时候就是指定颜色即可.

6.拓展设置

只能单独在xml里面设置多不方便啊,可以写几个set方法啊,想怎么设置就可以怎么设置

    public void hideRightImg() {
        iv_right.setVisibility(View.GONE);
    }

    public void setLeftText(CharSequence text) {
        tv_left.setVisibility(View.VISIBLE);
        tv_left.setText(text);
    }

    public void setLeftTextColor(int resourceId) {
        tv_left.setTextColor(resourceId);
    }
7.使用

以上弄完就能正常使用了…xml里面直接引用即可.
在xml该自定义控件内添加属性时,记得在最外层的父布局添加

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

即可.然后就可以了.

<com.your_package.widget.CommonTextItem
                android:id="@+id/cti_device_name"
                android:layout_width="match_parent"
                android:layout_height="44dp"
                app:ctiLeftImg="@drawable/icon_xxx"
                app:ctiLeftText="@string/mine_xxx_left_text"
                app:ctiRightImg="@drawable/icon_common_row_enter"/>

以上,OVER…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简介欢迎使用SuperTextView,这篇文档将会向你展示如何使用这个控件来提高你构建项目的效率。CoverSuperTextView继承自TextView,它能够大量的减少布局的复杂程度,并且使得一些常见的效果变得十分容易实现且高效。同时,它内置了动画驱动,你只需要合理编写Adjuster,然后startAnim()就可以看到预期的动画效果。它仅仅是一个控件,所以你可以不费吹灰之力的在你的项目中集成使用。特点你从此不必再为背景图编写和管理大量文件了。重新优化的状态图功能使得你能够精确的控制状态图的大小,以及在SuperTextView中的位置。支持设置圆角,并且能够精确的控制圆角位置。能够轻松的实现控件边框效果。支持文字描边,这使得空心文字效果成为了可能。内置动画驱动,你只需配合Adjuster合理的使用即可。Adjuster的出现,使得你对控件的绘制过程具有了掌控权,良好的设计使得它能够完美的实现绝大部分你脑海中的效果。使用指南支持的属性SuperTextView十分方便的支持在xml中直接设置属性,并且你能够立即看到效果。就像你平时使用TextView一样方便。<SuperTextView     android:layout_width="50dp"     android:layout_height="50dp"     //设置圆角。会同时作用于填充和边框(如果边框存在的话)。     //如果要设置为圆形,只需要把该值设置为宽或长的1/2即可。      app:corner="25dp"       //设置左上角圆角     app:left_top_corner="true"     //设置右上角圆角     app:right_top_corner="true"     //设置左下角圆角     app:left_bottom_corner="true"     //设置右下角圆角     app:right_bottom_corner="true"     //设置填充颜色     app:solid="@color/red"       //设置边框颜色     app:stroke_color="@color/black"       //设置边框的宽度。     app:stroke_width="2dp"      //放置一个drawable在背景层上。默认居中显示。     //并且默认大小为SuperTextView的一半。     app:state_drawable="@drawable/emoji"       //设置drawable的显示模式。可选值如下:     // left、top、right、bottom、center(默认值)、     //leftTop、rightTop、leftBottom、rightBottom、     //fill(充满整个SuperTextView,此时会使设置drawable的大小失效)     app:state_drawable_mode="center"      //设置drawable的height     app:state_drawable_height="30dp"     //设置drawable的width     app:state_drawable_width="30dp"     //设置drawble相对于基础位置左边的距离     app:state_drawable_padding_left="10dp"     //设置drawble相对于基础位置上边的距离     app:state_drawable_padding_top="10dp"     // boolean类型。是否显示drawable。     //如果你想要设置的drawable显示出来,必须设置为true。     //当不想让它显示时,再设置为false即可。     app:isShowState="true"      //是否开启文字描边功能。     //注意,启用这个模式之后通过setTextColor()设置的颜色将会被覆盖。     //你需要通过text_fill_color来设置文字的颜色。     app:text_stroke="true"      // 文字的描边颜色。默认为Color.BLACK。     app:text_stroke_color="@color/black"     // 文字描边的宽度。     app:text_stroke_width="1dp"     // 文

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值