android UI 设计 shape selector

前言

在我们的日常开发当中,通常会因为UI需求去编写大量的shape和selector资源,下面介绍一个框架能够替代shape和selector资源,直接在xml文件中写就行了,非常的方便,传送门

实例效果

image

使用方式

第一步: 在module的build.gradle文件下做如下依赖

implementation 'com.noober.background:core:1.2.0'

第二步: 在BaseActivity中的super.onCreate之前调用如下代码

BackgroundLibrary.inject(this);

第三部: 直接在xml文件中添加属性即可

支持的自定义属性

下面是所有的自定义属性,使用方法和shape、selector完全一样

shape类

支持shape的所有属性,命名规则就是标签名_标签属性名:

名称类型
shaperectangle、oval、line、ring(暂时不支持)
solid_colorcolor
corners_radiusdimension
corners_bottomLeftRadiusdimension
corners_bottomRightRadiusdimension
corners_topLeftRadiusdimension
corners_topRightRadiusdimension
gradient_angleinteger
gradient_centerXfloat
gradient_centerYfloat
gradient_centerColorcolor
gradient_endColorcolor
gradient_startColorcolor
gradient_gradientRadiusdimension
gradient_typelinear、radial、sweep
gradient_useLevelboolean
size_widthdimension
size_heightdimension
stroke_widthdimension
stroke_colorcolor
stroke_dashWidthdimension
stroke_dashGapdimension

selector类

支持selector的所有属性:

名称类型
checkable_drawablecolor、reference
checked_drawablecolor、reference
enabled_drawablecolor、reference
selected_drawablecolor、reference
pressed_drawablecolor、reference
focused_drawablecolor、reference
focused_hoveredcolor、reference
focused_activatedcolor、reference
unCheckable_drawablecolor、reference
unChecked_drawablecolor、reference
unEnabled_drawablecolor、reference
unSelected_drawablecolor、reference
unPressed_drawablecolor、reference
unFocused_drawablecolor、reference
unFocused_hoveredcolor、reference
unFocused_activatedcolor、reference

其他属性

名称类型备注
ripple_enableboolean是否开启点击的水波纹效果
ripple_colorcolor水波纹颜色(如果开启,一定要有这个属性能生效)
unpressed_colorcolor没有按下的时候的颜色(早版本的属性,可以被pressed_drawable替换)
pressed_colorcolor按下时候的颜色(早版本的属性,可以被unPressed_drawable替换)

使用例子

1, 边框+背景+圆角

<TextView
android:layout_width="130dp"
android:layout_height="36dp"
android:gravity="center"
android:text="TextView"
android:textColor="#8c6822"
android:textSize="20sp"
app:corners_radius="2dp"
app:solid_color="#E3B666"
app:stroke_color="#8c6822"
app:stroke_width="2dp" />

等同于

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="2dp"/>
<solid android:color="#E3B666"/>
<stroke android:color="#E3B666" android:width="2dp"/>
</shape>

效果图:

 

2, 渐变

<Button
android:id="@+id/btn"
android:layout_width="130dp"
android:layout_height="36dp"
android:layout_marginTop="5dp"
android:gravity="center"
android:padding="0dp"
android:text="跳转到列表"
android:textColor="#4F94CD"
android:textSize="20sp"
app:corners_radius="2dp"
app:gradient_angle="0"
app:gradient_endColor="#4F94CD"
app:gradient_startColor="#63B8FF" />

等同于

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="2dp"/>
<gradient android:angle="0" 
          android:startColor="#63B8FF"
          android:endColor="#4F94CD"/>
</shape>

效果图:

 

3, 点击效果

 

第一个点赞效果:

<TextView
  android:layout_marginTop="5dp"
  android:layout_width="20dp"
  android:layout_height="20dp"
  app:pressed_drawable="@drawable/circle_like_pressed"
  app:unPressed_drawable="@drawable/circle_like_normal" />

等同于

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
    android:drawable="@drawable/circle_like_pressed" />
<item android:state_pressed="false"
    android:drawable="@drawable/circle_like_normal" />
</selector>

第二个按钮效果:

<Button
  android:layout_width="300dp"
  android:layout_height="50dp"
  android:layout_marginTop="5dp"
  android:gravity="center"
  android:padding="0dp"
  android:text="有波纹触摸反馈的按钮"
  android:textColor="@android:color/white"
  android:textSize="20sp"
  app:corners_radius="20dp"
  app:pressed_drawable="#71C671"
  app:ripple_color="#71C671"
  app:ripple_enable="true"
  app:stroke_color="#8c6822"
  app:stroke_width="2dp"
  app:unPressed_drawable="#7CFC00" />

使用其实基本和selector shape一样。

使用注意

1、selector的相关属性,如果传入的drawable不是颜色的资源,会覆盖掉shape设置的属性
2、在根布局添加

    tools:ignore="MissingPrefix"

可以防止报红
3、因为layoutInflater限制了只能有一个factory,如果有其他库已经使用了setFactory方法,比如换肤的库,只需要在其他库调用layoutInflater.setFactory之后调用

BackgroundLibrary.inject2(context);

这样其他的库与本库同样可以生效。
4、selector一个item表示多个属性,暂时无法实现,如下:

 <item android:state_pressed="true" android:state_focused="true"
    android:drawable="@drawable/button_pressed" />

因为无法用一个属性去表示两种状态,有思路的同学可以告诉我
5、fragment使用无需任何处理,其Activity调用inject即可
6、listView,recyclerView使用也无需任何处理。
如果不生效,只需要

//在调用inflate只需调用一次context,保证adapter创建View时传入的是同一个context即可
BackgroundLibrary.inject(context);

View item = LayoutInflater.from(context).inflate(xxx)

7、自定义View中调用了inflate,同listView一样处理即可



作者:妖孽那里逃
链接:https://www.jianshu.com/p/ae5f25460dd6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值