SupportWidget一个简单且够用的Android控件扩展selector、shape标签等功能UI库.

一、初衷

网上关于扩展shape、实现selector功能的库很多,但是大多存在过渡封装,使其变得臃肿,变得不再各司其职,违背指责单一原则。
比如一个TextView实现下载图片功能,那还需要ImageView做什么?TextView实现按钮功能,那还需要Button做什么?……等等?
不是说这样不好,只是在很多时候这些过渡封装实现的功能显得有点鸡肋。

所以,本库的初衷就是追求:简单且够用!!!

二、部分功能效果如下,可自由搭配实现更新更多效果:

部分效果.jpg

部分效果.jpg

三、优点

1.轻量:简单且够用!!!

2.功能强大:几乎包含drawable-shape标签下所有属性,包含drawable-selector标签下disable、pressed、selected、focused、default选择器状态。

3.覆盖面广:实现了TextView、EditText、Button、ImageView、CheckBox、LinearLayout等等常用控件扩展功能。

4.特殊功能:实现文字描边、渐变、着色、旋转等功能。

5.使用简单:告别总是需要在drawable中定义选择器的烦恼,xml中轻松配置。

6.智能规范:xml布局中属性智能提示,命名规范不需要记忆大量属性名称。

7.各司其职:职责单一,需要什么功能用什么控件。

8.扩展简单:可根据需要只需要几行代码就能移植该库实现功能到自定义View或者本库未提供的系统View中。

四、目前该库包含的控件分为以下4类

1.View子类、TextView及其子类扩展类,该类控件实现了shape标签和选择器功能:

控件 父类 shape标签 selector标签 文字描边(支持各状态)、渐变等 图片着色(支持各状态)、旋转等
SupportTextView AppCompatTextView(TextView) - -
SupportAutoCompleteTextView AppCompatAutoCompleteTextView
(AutoCompleteTextView)
- -
SupportMultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView
(MultiAutoCompleteTextView)
- -
SupportButton AppCompatButton(Button) - -
SupportEditText AppCompatEditText(EditText) - -
SupportCheckBox AppCompatCheckBox(CheckBox) - -
SupportRadioButton AppCompatRadioButton(RadioButton) - -
SupportImageView AppCompatImageView(ImageView) - -
SupportImageButton AppCompatImageButton(ImageButton) - -

2.ViewGroup子类扩展类,该类控件实现了shape标签和选择器功能:

控件 父类 shape标签 selector标签 文字描边(支持各状态)、渐变等 图片着色(支持各状态)、旋转等
SupportLinearLayout LinearLayout - -
SupportFrameLayout FrameLayout - -
SupportRelativeLayout RelativeLayout - -
SupportRadioGroup RadioGroup - -
SupportSearchView SearchView - -

3.特殊功能(描边、着色等)扩展类,该类控件在第一类基础上扩展了一些特殊功能:

控件 父类 shape标签 selector标签 文字描边(支持各状态)、渐变等 图片着色(支持各状态)、旋转等
SupportFeatureTextView SupportTextView -
SupportFeatureButton SupportButton -
SupportFeatureImageView SupportImageView -

4.用户自定义扩展类,该类控件主要用来提供给需要在自定义控件中实现以上功能时使用:

控件 父类 shape标签 selector标签 文字描边(支持各状态)、渐变等 图片着色(支持各状态)、旋转等
SupportView View - -
SupportViewGroup ViewGroup - -

五、使用步骤

1.添加依赖

step one:

allprojects {
    repositories {
        maven { url 'https://www.jitpack.io' }
    }
}

step two :

dependencies {
        implementation 'com.github.FengChenSunshine:SupportWidget:1.0.0'
}

六、属性

1.默认状态属性:

属性 对应标签 描述 备注
widget_shape shape标签
->shape属性
可选值:
rectangle
oval
line
ring
widget_size_width shape标签
->size标签
->width属性
dimension
widget_size_height shape标签
->size标签
->height属性
dimension
widget_padding_left shape标签
->padding标签
->left属性
dimension
widget_padding_top shape标签
->padding标签
->top属性
dimension
widget_padding_right shape标签
->padding标签
->right属性
dimension
widget_padding_bottom shape标签
->padding标签
->bottom属性
dimension
widget_corners_radius shape标签
->corners标签
->radius属性
全部的圆角半径 dimension 会被下面其它对应值覆盖
widget_corners_top_left_radius shape标签
->corners标签
->topLeftRadius属性
左上角的圆角半径 dimension
widget_corners_top_right_radius shape标签
->corners标签
->topRightRadius属性
右上角的圆角半径 dimension
widget_corners_bottom_left_radius shape标签
->corners标签
->bottomLeftRadius属性
左下角的圆角半径 dimension
widget_corners_bottom_right_radius shape标签
->corners标签
->bottomRightRadius属性
右下角的圆角半径 dimension
widget_stroke_color shape标签
->stroke标签
->color属性
描边的颜色 color
widget_stroke_width shape标签
->stroke标签
->width属性
描边的宽度 dimension
widget_stroke_dash_width shape标签
->stroke标签
->dashWidth属性
虚线的宽度 dimension 值为0时是实线
widget_stroke_dash_gap shape标签
->stroke标签
->dashGap属性
虚线的间隔 dimension
widget_solid shape标签
->solid标签
->color属性
内部填充色 color
widget_gradient_start_color shape标签
->gradient标签
->startColor属性
渐变开始点的颜色 color
widget_gradient_center_color shape标签
->gradient标签
->centerColor属性
渐变中间点的颜色 color 在开始与结束点之间
widget_gradient_end_color shape标签
->gradient标签
->endColor属性
渐变结束点的颜色 color
widget_gradient_angle shape标签
->gradient标签
->angle属性
渐变角度 可选值:
left_right
bl_tr
bottom_top
br_tl
right_left
tr_bl
top_bottom
tl_br
仅在widget_gradient_type=
"integer"时有效,且必须为45的倍数,
0为从左到右,90为从上到下.
这里使用枚举代替原生的数值方式
widget_gradient_center_x shape标签
->gradient标签
->centerX属性
渐变中心X的相当位置 float、fraction 范围为0.0~1.0,仅在widget_gradient_type属性不为linear时有效
widget_gradient_center_y shape标签
->gradient标签
->centerY属性
渐变中心Y的相当位置 float、fraction 范围为0.0~1.0,仅在widget_gradient_type属性不为linear时有效
widget_gradient_radius shape标签
->gradient标签
->gradientRadius属性
渐变的半径 dimension 只有当渐变类型为radial时才能使用
widget_gradient_type shape标签
->gradient标签
->type属性
渐变模式 可选值:
linear
radial
sweep
线性渐变、放射性渐变、扫描式渐变
widget_gradient_use_level shape标签
->gradient标签
->useLevel属性
useLevel属性通常不使用 boolean 该属性用于指定是否将该shape
当成一个LevelListDrawable来使用,默认值为false
widget_ripple_color ripple标签
->color属性
水波纹效果颜色 color 5.0以上默认开启,
未设置时首先会尝试获取
android.support.v7.appcompat.
R.attr.colorControlHighlight属性值;
获取失败时使用默认值#1f000000,
该值取自v7 28.0.0版本Base.ThemeOverlay.AppCompat.Light主题下colorControlHighlight属性值
widget_ripple_enabled 水波纹效果控制开关 boolean 5.0以上默认开启水波纹效果,
但是可以通过设置此值为false可以关闭该默认效果
widget_text_color - TextView等文本控件Text文字颜色 color
widget_hint_text_color TextView等文本控件Hint文字颜色 color

2.disable禁用状态属性:

disable状态拥有上面属性1中默认状态下除过水波纹以外的所有属性,
命名规则为将以上widget_修改为widget_disabled_格式,含义等其它信息均保持不变。
具体有如下属性:

    <attr name="widget_disabled_shape"/>
    <attr name="widget_disabled_size_width"/>
    <attr name="widget_disabled_size_height"/>
    <attr name="widget_disabled_padding_left"/>
    <attr name="widget_disabled_padding_top"/>
    <attr name="widget_disabled_padding_right"/>
    <attr name="widget_disabled_padding_bottom"/>
    <attr name="widget_disabled_corners_radius"/>
    <attr name="widget_disabled_corners_top_left_radius"/>
    <attr name="widget_disabled_corners_top_right_radius"/>
    <attr name="widget_disabled_corners_bottom_left_radius"/>
    <attr name="widget_disabled_corners_bottom_right_radius"/>
    <attr name="widget_disabled_stroke_color"/>
    <attr name="widget_disabled_stroke_width"/>
    <attr name="widget_disabled_stroke_dash_width"/>
    <attr name="widget_disabled_stroke_dash_gap"/>
    <attr name="widget_disabled_solid"/>
    <attr name="widget_disabled_gradient_start_color"/>
    <attr name="widget_disabled_gradient_center_color"/>
    <attr name="widget_disabled_gradient_end_color"/>
    <attr name="widget_disabled_gradient_angle"/>
    <attr name="widget_disabled_gradient_center_x"/>
    <attr name="widget_disabled_gradient_center_y"/>
    <attr name="widget_disabled_gradient_radius"/>
    <attr name="widget_disabled_gradient_type"/>
    <attr name="widget_disabled_gradient_use_level"/>
    <attr name="widget_disabled_text_color"/>
    <attr name="widget_disabled_hint_text_color"/>

3.pressed触摸按压状态属性:

pressed状态拥有上面属性1中默认状态下除过水波纹以外的所有属性,
命名规则为将以上widget_修改为widget_pressed_格式,含义等其它信息均保持不变。
eg:

<attr name="widget_pressed_text_color"/>

其它同上,不再赘述。

4.selected选中状态属性:

selected状态拥有上面属性1中默认状态下除过水波纹以外的所有属性,
命名规则为将以上widget_修改为widget_selected_格式,含义等其它信息均保持不变。
eg:

<attr name="widget_selected_text_color"/>

其它同上,不再赘述。

5.focused获得焦点状态属性:

focused状态拥有上面属性1中默认状态下除过水波纹以外的所有属性,
命名规则为将以上widget_修改为widget_focused_格式,含义等其它信息均保持不变。
eg:

<attr name="widget_focused_text_color"/>

其它同上,不再赘述。

6.文字描边效果属性:

属性 对应标签 描述 备注
widget_contour_width 描边宽度 dimension
widget_contour_text_color 默认状态下描边颜色 color
widget_checked_contour_text_color checked状态下描边颜色 color
widget_disabled_contour_text_color disabled状态下描边颜色 color
widget_focused_contour_text_color focused状态下描边颜色 color
widget_pressed_contour_text_color pressed状态下描边颜色 color
widget_selected_contour_text_color selected状态下描边颜色 color

7.文字颜色渐变效果属性:

属性 对应标签 描述 备注
widget_shader_text_start_color 渐变开始颜色 color
widget_shader_text_center_color 渐变中间颜色 color
widget_shader_text_end_color 渐变结束颜色 color
widget_shader_text_start_position 渐变开始位置颜色偏移 float 不设置时为线性渐变
widget_shader_text_center_position 渐变中间位置颜色偏移 float 不设置时为线性渐变
widget_shader_text_end_position 渐变结束位置颜色偏移 float 不设置时为线性渐变
widget_shader_text_colors 渐变颜色 string 格式:#RRGGBB,#RRGGBB,……#RRGGBB
或#AARRGGBB,#AARRGGBB,……#AARRGGBB
widget_shader_text_positions 渐变位置颜色偏移 string 范围:0.0-1.0
格式:float,float,……float
简单校验:第一个值必须小于1,
最后一个值必须大于0
如果设置了该属性,
那么个数必须和widget_shader_text_colors匹配.
不设置时为线性渐变.

8.图片Tint(着色)、旋转效果属性:

属性 对应标签 描述 备注
widget_src_tint 默认状态下tint颜色 color
widget_checked_src_tint checked状态下tint颜色 color
widget_disabled_src_tint disabled状态下tint颜色 color
widget_focused_src_tint focused状态下tint颜色 color
widget_pressed_src_tint pressed状态下tint颜色 color
widget_selected_src_tint selected状态下tint颜色 color
widget_src_rotate_degrees 图片旋转角度 float、fraction 系统rotation属性会导致View整体旋转
使用该属性可以实现仅旋转图片
该功能和tint搭配使用可以有效减小APK体积

七、选择器效果实现、完整用法示例

将之前的属性描述中的1到5部分的默认状态、disable禁用状态、pressed触摸按压状态、selected选中状态、focused获得焦点状态搭配结合使用即可获得选择器效果。

1.背景选择器eg:

<com.duanlu.widget.SupportLinearLayout
             android:layout_width="20dp"
             android:layout_height="20dp"
             
             <!--默认状态-->
             
             app:widget_corners_radius="8dp"
             app:widget_corners_bottom_left_radius="8dp"
             app:widget_corners_bottom_right_radius="8dp"
             app:widget_corners_top_left_radius="8dp"
             app:widget_corners_top_right_radius="8dp"
 
             app:widget_gradient_start_color="#0000ff"
             app:widget_gradient_center_color="#00ff00"
             app:widget_gradient_end_color="#ff0000"
             app:widget_gradient_center_x="0.5"
             app:widget_gradient_center_y="0.5"
             app:widget_gradient_type="linear"
             app:widget_gradient_radius="50dp"
             app:widget_gradient_angle="left_right"
             app:widget_gradient_use_level="false"
 
             app:widget_solid="#008577"
 
             app:widget_stroke_color="#000000"
             app:widget_stroke_dash_gap="5dp"
             app:widget_stroke_dash_width="5dp"
             app:widget_stroke_width="2dp"
 
             <!--disabled状态-->
             
             app:widget_disabled_corners_radius="8dp"
             app:widget_disabled_corners_bottom_left_radius="8dp"
             app:widget_disabled_corners_bottom_right_radius="8dp"
             app:widget_disabled_corners_top_left_radius="8dp"
             app:widget_disabled_corners_top_right_radius="8dp"
 
             app:widget_disabled_gradient_start_color="#0000ff"
             app:widget_disabled_gradient_center_color="#00ff00"
             app:widget_disabled_gradient_end_color="#ff0000"
             app:widget_disabled_gradient_center_x="0.5"
             app:widget_disabled_gradient_center_y="0.5"
             app:widget_disabled_gradient_type="linear"
             app:widget_disabled_gradient_radius="50dp"
             app:widget_disabled_gradient_angle="left_right"
             app:widget_disabled_gradient_use_level="false"
 
             app:widget_disabled_solid="#008577"
 
             app:widget_disabled_stroke_color="#000000"
             app:widget_disabled_stroke_dash_gap="5dp"
             app:widget_disabled_stroke_dash_width="5dp"
             app:widget_disabled_stroke_width="2dp"
 
             <!--pressed状态-->
             
             app:widget_pressed_corners_radius="8dp"
             app:widget_pressed_corners_bottom_left_radius="8dp"
             app:widget_pressed_corners_bottom_right_radius="8dp"
             app:widget_pressed_corners_top_left_radius="8dp"
             app:widget_pressed_corners_top_right_radius="8dp"
 
             app:widget_pressed_gradient_start_color="#0000ff"
             app:widget_pressed_gradient_center_color="#00ff00"
             app:widget_pressed_gradient_end_color="#ff0000"
             app:widget_pressed_gradient_center_x="0.5"
             app:widget_pressed_gradient_center_y="0.5"
             app:widget_pressed_gradient_type="linear"
             app:widget_pressed_gradient_radius="50dp"
             app:widget_pressed_gradient_angle="left_right"
             app:widget_pressed_gradient_use_level="false"
 
             app:widget_pressed_solid="#008577"
 
             app:widget_pressed_stroke_color="#000000"
             app:widget_pressed_stroke_dash_gap="5dp"
             app:widget_pressed_stroke_dash_width="5dp"
             app:widget_pressed_stroke_width="2dp"
 
             <!--selected状态-->
             
             app:widget_selected_corners_radius="8dp"
             app:widget_selected_corners_bottom_left_radius="8dp"
             app:widget_selected_corners_bottom_right_radius="8dp"
             app:widget_selected_corners_top_left_radius="8dp"
             app:widget_selected_corners_top_right_radius="8dp"
 
             app:widget_selected_gradient_start_color="#0000ff"
             app:widget_selected_gradient_center_color="#00ff00"
             app:widget_selected_gradient_end_color="#ff0000"
             app:widget_selected_gradient_center_x="0.5"
             app:widget_selected_gradient_center_y="0.5"
             app:widget_selected_gradient_type="linear"
             app:widget_selected_gradient_radius="50dp"
             app:widget_selected_gradient_angle="left_right"
             app:widget_selected_gradient_use_level="false"
 
             app:widget_selected_solid="#008577"
 
             app:widget_selected_stroke_color="#000000"
             app:widget_selected_stroke_dash_gap="5dp"
             app:widget_selected_stroke_dash_width="5dp"
             app:widget_selected_stroke_width="2dp"
 
             <!--focused状态-->
             
             app:widget_focused_corners_radius="8dp"
             app:widget_focused_corners_bottom_left_radius="8dp"
             app:widget_focused_corners_bottom_right_radius="8dp"
             app:widget_focused_corners_top_left_radius="8dp"
             app:widget_focused_corners_top_right_radius="8dp"
 
             app:widget_focused_gradient_start_color="#0000ff"
             app:widget_focused_gradient_center_color="#00ff00"
             app:widget_focused_gradient_end_color="#ff0000"
             app:widget_focused_gradient_center_x="0.5"
             app:widget_focused_gradient_center_y="0.5"
             app:widget_focused_gradient_type="linear"
             app:widget_focused_gradient_radius="50dp"
             app:widget_focused_gradient_angle="left_right"
             app:widget_focused_gradient_use_level="false"
 
             app:widget_focused_solid="#008577"
 
             app:widget_focused_stroke_color="#000000"
             app:widget_focused_stroke_dash_gap="5dp"
             app:widget_focused_stroke_dash_width="5dp"
             app:widget_focused_stroke_width="2dp"/>

2.文本选择器eg:

 <com.duanlu.widget.SupportTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            app:widget_text_color="#333333"
            app:widget_disabled_text_color="#333333"
            app:widget_pressed_text_color="#333333"
            app:widget_selected_text_color="#333333"
            app:widget_checked_text_color="#333333"
            app:widget_focused_text_color="#333333"

            app:widget_hint_text_color="#333333"
            app:widget_disabled_hint_text_color="#333333"
            app:widget_pressed_hint_text_color="#333333"
            app:widget_selected_hint_text_color="#333333"
            app:widget_checked_hint_text_color="#333333"
            app:widget_focused_hint_text_color="#333333"/>

3.描边选择器、渐变文字eg:

<com.duanlu.widget.SupportFeatureTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="48sp"

            app:widget_contour_width="5dp"
            app:widget_contour_text_color="#008577"
            app:widget_checked_contour_text_color="#008577"
            app:widget_disabled_contour_text_color="#008577"
            app:widget_pressed_contour_text_color="#008577"
            app:widget_focused_contour_text_color="#008577"
            app:widget_selected_contour_text_color="#008577"

            app:widget_shader_text_start_color="#ff0000"
            app:widget_shader_text_center_color="#00ff00"
            app:widget_shader_text_end_color="#0000ff"
            app:widget_shader_text_start_position="0.1"
            app:widget_shader_text_center_position="#0.5"
            app:widget_shader_text_end_position="0.9"
            <!--或者-->
            app:widget_shader_text_colors="#ff0000,#00ff00,#0000ff"
            app:widget_shader_text_positions="0.1,0.5,0.9"/>

4.图片着色、旋转eg:

<com.duanlu.widget.SupportFeatureImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            <!--仅旋转图片-->
            android:rotation="30"
            <!--着色-->
            app:widget_src_tint="#008577"
            app:widget_disabled_src_tint="#008577"
            app:widget_pressed_src_tint="#008577"
            app:widget_selected_src_tint="#008577"
            app:widget_checked_src_tint="#008577"
            app:widget_focused_src_tint="#008577"/>

5.自定义View中集成该库功能eg:

①选择直接继承SupportView或SupportViewGroup即可实现自己的背景选择器功能。

②选择继承SupportTextView等即可实现自己的背景选择器、文本颜色选择器功能。

③选择继承SupportFeatureTextView等类型即可实现自己的背景选择器、文本颜色选择器以及文本描边和渐变或图片着色、旋转灯功能。

④如果没有继承本库提供的控件但是想实现本库的功能,可以参考如下方式自行实现:

public class CustomView extends View {

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

    public CustomView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.initView(context, attrs, defStyleAttr, 0);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        this.initView(context, attrs, defStyleAttr, defStyleRes);
    }

    private void initView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        //实现背景选择器功能.
        new WidgetDrawableWrapper(this, attrs, defStyleAttr, defStyleRes);
        //实现文本颜色选择器功能(注意:第一个参数必须是TextView的子类).
        new WidgetTextWrapper(this, attrs, defStyleAttr, defStyleRes);
        //实现文本描边、渐变等功能(注意:第一个参数必须是TextView的子类).
        new TextFeature(this, attrs, defStyleAttr, defStyleRes);
        //实现图片着色、旋转灯等功能(注意:第一个参数必须是AppCompatImageView的子类).
        new ImageFeature(this, attrs, defStyleAttr, defStyleRes);
    }
}

注意:如果想在自己自定义的View在xml中拥有IDE代码提示功能,那么你需要在res->values->attrs中以自定义View名字定义一个属性即可,eg:

<declare-styleable name="CustomView">
        <attr name="widget_corners_radius" />
        <attr name="widget_corners_top_left_radius" />
        <attr name="widget_corners_top_right_radius" />
        <attr name="widget_corners_bottom_left_radius" />
        <attr name="widget_corners_bottom_right_radius" />
        <attr name="widget_stroke_color" />
        <attr name="widget_stroke_width" />
        <attr name="widget_stroke_dash_width" />
        <attr name="widget_stroke_dash_gap" />
        <attr name="widget_solid" />
        ……<!--其它属性-->
    </declare-styleable>

这里仅列举了部分属性,自己需要根据实际情况添加属性即可,但是属性名称必须参考该库命名且必须保持命名一致。
具体可以复制attrsattrs_feature里的需要的属性到自己定义的文件里。

八、动态修改

原则上本库不提倡使用Java代码动态修改设置,建议使用xml中配置的方式设置。
但是如果真的有动态修改的需求,那么以SupportFeatureTextView为例,其它控件方法相同,可以通过以下方式动态修改:

1.修改背景色选择器相关:

SupportFeatureTextView view;
    view.getWidgetDrawableWrapper()
        .setRippleColor(@ColorInt int color)
        .setRippleColor(ColorStateList color)
        .setSize(@Status int status, int width, int height)
        .setCorners(@Status int status, float radius)
        .setCorners(@Status int status, float topLeftRadius, float topRightRadius, float bottomLeftRadius, float bottomRightRadius)
        .setStroke(@Status int status, int strokeWidth, @ColorInt int strokeColor)
        .setStroke(@Status int status, int strokeWidth, @NonNull ColorStateList strokeColor)
        .setStroke(@Status int status, int strokeWidth, @ColorInt int strokeColor, int strokeDashWidth, int strokeDashGap)
        .setStroke(@Status int status, int strokeWidth, @NonNull ColorStateList strokeColor, int strokeDashWidth, int strokeDashGap)
        .setSolidColor(@Status int status, @ColorInt int color)
        .setSolidColor(@Status int status, @NonNull ColorStateList colorStateList)
        .setColors(@Status int status, int startColor, int endColor)
        .setColors(@Status int status, int startColor, int centerColor, int endColor)
        .setGradientCenter(@Status int status, float x, float y)
        .setGradientType(@Status int status, int gradientType)
        .setOrientation(@Status int status, GradientDrawable.Orientation orientation)
        .setGradientRadius(@Status int status, float gradientRadius)
        .setUseLevel(@Status int status, boolean useLevel)

2.修改文字选择器颜色相关:

不提供,可通过TextView及其子类中原生方法:
textView.setTextColor(colorStateList);
textView.setHintTextColor(colorStateList);修改。

3.文字描边、文字渐变相关:

SupportFeatureTextView view;
    view.getTextFeature()
        .setContourColor(ColorStateList contourColor)
        .setContourWidth(float contourWidth)
        .setContour(float contourWidth, ColorStateList contourColor)
        .setShader(int[] colors)
        .setShader(int[] colors, float[] position);

4.ImageView旋转图片相关:

SupportFeatureImageView view;
    view.getImageFeature()
        .setRotateDegrees(float rotateDegrees);

九、Q&A

Q1.为什么仅设置背景选择器中某一状态的一个属性会导致比如默认状态为圆角,选中状态为直角了?

A:遵从在drawable-selector中定义shape一样,每种状态样式单独定义。

Q2.为什么比如设置了文本颜色选择器获取焦点时的颜色但是没有效果?

A:使用文本颜色选择器时必须使用widget_text_color或widget_hint_text_color属性设置默认颜色其它状态颜色才会有效。

Q3.为什么比如设置了描边颜色选择器获取焦点时的描边颜色但是没有效果?

A:使用描边颜色选择器时必须使用widget_contour_text_color属性设置默认描边颜色其它状态颜色才会有效。

Q4.为什么比如使用widget_shader_text_start_color属性设置了文本颜色渐变但是没有效果?

A:文本颜色渐变效果必须设置2个以上颜色时才会有效,并且如果有设置position时,position和color必须匹配,否则可能会导致程序崩溃。

十、版本说明

1.0.0

1.提供常用的基于selector、shape的背景选择器功能;

2.提供基于ColorStateList的颜色选择器功能;

3.提供文本描边、渐变功能;

4.提供ImageView图片着色、旋转功能。
5.开放自定义控件实现该库功能的能力。

十一、附上GitHub链接,喜欢的可以去点个赞哦!!!

十二.最后,喜欢的话可以点个赞哦!!!

十三.我的开源库链接

1.

是我的另一个开源库:一个简单且强大的Ui状态视图控制库!喜欢的可以看看,欢迎start!!!

2.

是我的另一个开源库:一个追求简单够用且强大的UI组件库!喜欢的可以看看,欢迎start!!!

3.

是我的另一个开源库:提供一个应用版本更新功能的库!喜欢的可以看看,欢迎start!!!

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

推荐阅读更多精彩内容