ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

告别海量selector文件:MeiWidgetView的Radius圆角状态控件与Delegate委托模式

告别海量selector文件:MeiWidgetView的Radius圆角状态控件与Delegate委托模式 告别海量selector文件MeiWidgetView的Radius圆角状态控件与Delegate委托模式【免费下载链接】MeiWidgetView一款汇总了郭霖鸿洋以及自己平时收集的自定义控件集合库小红书项目地址: https://gitcode.com/gh_mirrors/me/MeiWidgetView做Android界面时你是不是也被selector文件折磨过一个按钮的按下、禁用、选中状态就要手写一堆shape和selector xml项目一大drawable目录里就堆成山。开源项目MeiWidgetView一款汇总郭霖、鸿洋及作者自收集的自定义控件集合库中的Radius圆角状态控件用一个Delegate委托类就能替代这些海量selector文件圆角、描边、涟漪、状态色切换全部通过XML属性一行搞定还支持Java链式调用。痛点为什么selector文件会成为维护噩梦传统方案里想让一个TextView实现按下变色圆角描边你至少需要写shape_normal.xml、shape_pressed.xml等一堆shape文件再写一个selector.xml把它们组合起来换一套配色就得逐个文件改改漏一个就出现状态错乱项目里有 50 个这样的控件恭喜你drawable 目录里躺着 100 个小文件Radius控件集的思路是把shapeselector的全部能力做成一组XML属性。快速上手XML一行属性搞定圆角状态切换支持6个原生控件RadiusTextView、RadiusCheckBox、RadiusEditText、RadiusFrameLayout、RadiusLinearLayout、RadiusRelativeLayout。以RadiusTextView为例官方演示布局 mei_radius_activity.xml 中有这样的写法com.meis.widget.radius.RadiusTextView android:layout_widthmatch_parent android:layout_height48dp android:text圆角支持四个角 app:rv_backgroundColorcolor/colorAccent app:rv_radius8dp app:rv_textColor#FFF /几个常用属性完整定义见 attrs_radius.xml属性作用rv_backgroundColor/rv_backgroundPressedColor常态 / 按下背景色rv_radius、rv_topLeftRadius等整体圆角 / 四角独立圆角rv_radiusHalfHeightEnable圆角自动等于高度一半胶囊按钮rv_strokeColor、rv_strokeWidth描边颜色与宽度支持虚线rv_rippleEnable、rv_rippleColorAndroid 5.0 水波纹效果rv_textPressedColor按下时文字变色演示页面的完整交互效果可在 MeiRadiusActivity.java 中查看。Java代码控制链式调用代替写文件不想写XMLRadius控件把shape属性全部做成了链式API通过getDelegate()即可mRadiusTextView.getDelegate() .setBackgroundColor(0xFFFF0000) .setBackgroundPressedColor(0xFF800000) .setRadius(16f) .setRippleEnable(true);核心设计Delegate委托模式拆解打开 RadiusViewDelegate.java公共属性解析代理类你会发现它构造时统一解析XML属性—— 背景色、描边、四角圆角、涟漪、状态切换延时等全部收敛在一个类里init()动态生成StateListDrawable—— 在 RadiusViewDelegate.java 中按需把 pressed、selected、checked、disabled 四种状态组装进背景完全等效于手写selector但运行时才生成磁盘上0个文件5.0自动切换RippleDrawable老系统回退到状态列表背景无需你写版本判断。而每个具体控件只需要极薄的壳。看 RadiusTextView.javapublic RadiusTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); delegate new RadiusTextViewDelegate(this, context, attrs); }TextView特有的文字变色、四方向Drawable状态切换则放在子类 RadiusTextViewDelegate.java 中通过init()方法先处理自身特有逻辑再调用super.init()层次非常干净。RadiusCheckBox.java 也是同一套模式。为什么值得学这种模式这个委托模式参考的是AppCompatActivity的设计思路好处很直接✅消除继承冲突控件只需单继承原生控件圆角能力以成员变量形式插入不再担心继承树打架✅零重复代码背景、描边、圆角逻辑只写一次6个控件共享✅易扩展想给某控件加新能力新增一个Delegate子类即可不动基类✅减小APK体积不再维护海量shape/selector小文件源码导读清单想深入源码建议按这条线读基类代理radius/delegate/RadiusViewDelegate.javaTextView代理radius/delegate/RadiusTextViewDelegate.java复合按钮代理radius/delegate/RadiusCompoundButtonDelegate.java控件实现radius/属性定义attrs_radius.xml写在最后MeiWidgetView的Radius控件集证明了用Delegate委托模式属性化配置可以把繁琐的selector文件全部消灭让UI状态管理变得直观、易改、直观可见。下次再面对一个按钮要三态变色圆角涟漪的需求时不妨试试这种写法——写完你会发现drawable目录清爽了不少 【免费下载链接】MeiWidgetView一款汇总了郭霖鸿洋以及自己平时收集的自定义控件集合库小红书项目地址: https://gitcode.com/gh_mirrors/me/MeiWidgetView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表