Android中自定义CommonShapeButton替换Shape标签

在Android开发中,作者发现shape文件过多导致维护困难。为了解决这一问题,作者介绍了如何创建一个名为CommonShapeButton的自定义视图,它支持文本和按钮样式,具有按压动效,能统一管理shape属性,包括形状、颜色、描边、圆角等,并处理drawable居中显示。通过Java和Kotlin实现,简化了XML布局。
摘要由CSDN通过智能技术生成

在原有的基础上,新增了java版本,目前支持kotlin和java两个版本,git地址:文章链接

又更新了,新增文字大小自适应方法,xml文件中可控

在Android开发中,使用Shape标签可以很方便的帮我们构建资源文件,跟传统的png图片相比:

  • shape标签可以帮助我们有效减小apk安装包大小。
  • 在不同手机的适配上面,shape标签也表现得更加优秀。

关于shape标签如何使用,在网上一搜一大把,笔者这里就不赘述了,今天我们要讨论的shape标签泛滥成灾以后带来的后果。这里先给大家看一个维护刚刚有3年的项目的drawable目录。

请注意右侧标红的滚动条,有没有感觉很酸爽,在这个目录下的文件现在已经接近400个了,并且还在不停的增加。我们分析这个目录下的xml构成,发现主要由两种类型构成:selector和shape。selector这里略过不提,重点是shape,发现shape文件已经超过一半多,并且还会不停的增加,我们在带着好奇的心态,随便点开几个shape看一看

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- solid的表示填充颜色 -->
    <solid android:color="#44ffffff"/>

    <stroke
        android:width="1px"
        android:color="#77ffffff"/>

    <!--为了展示半圆,就把角度设置的大点-->
    <corners android:radius="100dp"/>

</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <corners android:radius="1dip" />
    <stroke
        android:width="0.5dip"
        android:color="#ea474f" />
</shape>  


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="0.5dp"
        android:color="@color/color_de" />
    <solid android:color="@color/white" />
    <corners android:radius="5dp" />
</shape>

真的是不看不知道,一看吓一跳。原来我们项目中大量存在的shape文件其实都是大同小异的。涉及到最常见的shape变化:圆角,描边,填充以及渐变。进一步分析,我们又发现:

  • 有些时候填充颜色是相同的,只不过圆角半径不同,我们就得新增及一个shape文件。
  • 有些时候圆角半径是相同的,只不过填充颜色不同,我们又得增加一个shape文件。
  • 有些时候两个负责不同业务模块的同事,各自新增一个同样样式的shape文件。

等等一些情况,让我们陷入了shape文件的无限新增与维护中。我们不禁要思考,有没有办法可以把这些shape统一起来管理呢?xml书写出来的代码最终不都是会对应一个内存中的对象么?我们能不能从管理shape文件过渡到管理一个对象呢?

Talk is cheap 。 Show me the code

第一步,我们需要确定shape标签对应的泪到底是哪一个?第一反应就是ShapeDrawable,顾名思义嘛。然后残酷的事实告诉我们其实是GradientDrawable这兄弟。浏览GradientDrawable类的方法结构,从中我们也找到了setColor()、setCorner

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值