是时候放弃shape、selector XML写法,一行代码解决基本UI需求

举报
再见孙悟空_ 发表于 2022/01/12 22:37:02 2022/01/12
【摘要】 我们在写项目的时候,总是会写很多的shape.xml文件、selector.xml文件,虽然不难,但是有时候还是挺烦的,有很多很多的xml文件,增大apk不说,主要是写起来还是挺烦的(个人觉得)。所以写了个代码方式去实现。 1.shape 先上张图,看一下效果 1.1 矩形 rectFill.rect(getResCo...
我们在写项目的时候,总是会写很多的shape.xml文件、selector.xml文件,虽然不难,但是有时候还是挺烦的,有很多很多的xml文件,增大apk不说,主要是写起来还是挺烦的(个人觉得)。所以写了个代码方式去实现。

1.shape

先上张图,看一下效果

1.1 矩形

rectFill.rect(getResColor(R.color.fillColor))复制代码
 

1.2 带边框的矩形

rectFillAndStroke.rect(getResColor(R.color.fillColor), dpToPx(3f),getResColor(R.color.strokeColor))复制代码
 

1.3 圆角矩形

roundRectWithStroke.roundRect(getResColor(R.color.fillColor),cornerRadius = dpToPx2(10f),    strokeWidth = dpToPx(3f),strokeColor = getResColor(R.color.strokeColor))复制代码
 

1.4 圆角矩形(四个角不同)


  
  1. roundRect5.roundRect(getResColor(R.color.fillColor),dpToPx(3f),getResColor(R.color.strokeColor),
  2. leftTopCornerRadiusX = dpToPx2(10f),leftTopCornerRadiusY = dpToPx2(5f),
  3. rightTopCornerRadiusX = dpToPx2(5f),rightTopCornerRadiusY = dpToPx2(10f),
  4. leftBottomCornerRadiusX = dpToPx2(10f),leftBottomCornerRadiusY = dpToPx2(20f),
  5. rightBottomCornerRadiusX = dpToPx2(8f),rightBottomCornerRadiusY = dpToPx2(14f))复制代码

1.5 椭圆


  
  1. ovelRect1.ovel(getResColor(R.color.fillColor),
  2. cornerRadiusX = dpToPx2(50f), cornerRadiusY = dpToPx2(30f),
  3. strokeWidth = dpToPx(3f),strokeColor = getResColor(R.color.strokeColor))复制代码

1.6 渐变


  
  1. val gradientColors = intArrayOf(Color.YELLOW,Color.BLUE,Color.GREEN)
  2. gradient.gradient(gradientColors)
  3. gradient1.gradient(gradientColors,GradientDrawable.Orientation.LEFT_RIGHT)
  4. gradient2.gradient(gradientColors,GradientDrawable.Orientation.BL_TR)复制代码

2.selector

selector一般都是一些状态类的ui变化,常见的就是点击,选中

先上张图,看一下效果

2.1 点击状态

背景


  
  1. val pressedDrawable = buildDrawable(Color.parseColor("#8B9EB3"), dpToPx2(5f))
  2. val normalDrawable = buildDrawable(Color.parseColor("#4498F2"), dpToPx2(5f))
  3. btnPressed.pressed(normalDrawable,pressedDrawable)复制代码

文字颜色

btnPressed.pressedTextColor(Color.WHITE,Color.GRAY)复制代码
 

2.2 enable状态

背景


  
  1. val normalDrawable = buildDrawable(Color.parseColor("#4498F2"), dpToPx2(5f))
  2. val unenableDrawable = buildDrawable(Color.parseColor("#A8A9AC"), dpToPx2(10f))
  3. btnUnenable.enable(normalDrawable,unenableDrawable,false)复制代码

文字颜色

btnUnenable.enabledTextColor(Color.WHITE,Color.GRAY,false)复制代码
 

2.3 多状态叠加

背景


  
  1. val pressedDrawable = buildDrawable(Color.parseColor("#8B9EB3"), dpToPx2(5f))
  2. val normalDrawable = buildDrawable(Color.parseColor("#4498F2"), dpToPx2(5f))
  3. val unenableDrawable = buildDrawable(Color.parseColor("#A8A9AC"), dpToPx2(10f))
  4. val sd = buildStateListDrawable()
  5. .pressed(pressedDrawable)
  6. .enable(unenableDrawable,false)
  7. .normal(normalDrawable)
  8. btnMuilti.setStateDrawable(sd)复制代码

文字颜色


  
  1. val colorState = ColorStateBuilder()
  2. .enableTextColor(Color.GRAY,false)
  3. .pressedTextColor(Color.LTGRAY)
  4. .normalTextColor(Color.WHITE)
  5. .build()
  6. btnMuilti.setTextColor(colorState)复制代码

2.4 imageview图标状态

点击变换不同图标

iv_back.pressed(R.drawable.back,R.drawable.back_pressed)复制代码
 

enable不同图标

iv_back.enable(R.drawable.back,R.drawable.back_pressed,false)复制代码
 

2.5 radiobutton、checkbox图标状态

radiobutton


  
  1. radioButton.checkedTextColor(Color.parseColor("#bfbfbf"),Color.parseColor("#1296db"))
  2. radioButton.leftCheckedCompoundDrawable(R.drawable.ic_radio_normal,R.drawable.ic_radiobutton_checked)复制代码

checkbox


  
  1. checkBox2.checkedTextColor(Color.parseColor("#bfbfbf"),Color.parseColor("#1296db"))
  2. checkBox2.leftCheckedCompoundDrawable(R.drawable.checkbox_unchecked,R.drawable.checkbox_checked)复制代码

3.总结

       代码本身没什么技术难度,我也就不瞎逼逼什么原理了,主要就是封装一下使用而已,简化工作流程。唯一要注意的是使用前要先注入application,ApplactionInject.inject(this)  其实也就是获得一个全局的Context,大家都懂,省得很多方法都要加Context参数 。
       总体使用还是很方便的,基本上一行代码就能搞定基本的UI需求,在也不需要像以前一样需要写烦人的xml了,大大减少xml的文件数量

4.源码

github地址:https://github.com/JiangW01/Sample01

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/103474681

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。