ShapeView——让你可以像写XML一样在代码中编写shape样式

这些工作场景,相信作为Android开发者的各位,都经历过,编写一个简单的样式都要经历这些,那么,有没有一种简单的办法去在代码中直接编写这种样式呢?

  • 你平时写 Shape 是不是这样滴

第一步:先给shape文件起个名字

第二步:像这样编写shape样式

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">
    
    <stroke android:color="#ffff0000"
        android:width="2dp"/>
    
    <solid android:color="#8000ff00" />

    <corners android:radius="20dp" />
    </shape>

第三步:在用到的地方设置引用

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@drawable/xxx_xxx_xxx_xxx"
    android:gravity="center"
    android:padding="10dp"
    android:text="圆角矩形-左右两边都是半圆弧-带边框"
    android:textColor="@android:color/black"
    android:textSize="14sp" />

第四步:看看自己写的丑到要哭的样式

这样,你不感觉到繁琐吗?

这些工作场景,相信作为Android开发者的各位,都经历过,编写一个简单的样式都要经历这些,那么,有没有一种简单的办法去在代码中直接编写这种样式呢?

当然有了,我在很多项目中也经常使用这个——ShapeView(项目地址

使用起来也是非常方便的,你可以用它来编写市面上大部分效果,如下面这些:

那么,该如何在项目中使用呢?

集成步骤:


  • 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入

allprojects {     repositories {         // JitPack 远程仓库:https://jitpack.io         maven { url 'https://jitpack.io' }     } }

  • 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入

dependencyResolutionManagement {     repositories {         // JitPack 远程仓库:https://jitpack.io         maven { url 'https://jitpack.io' }     } }

  • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖

android {     // 支持 JDK 1.8     compileOptions {         targetCompatibility JavaVersion.VERSION_1_8         sourceCompatibility JavaVersion.VERSION_1_8     } } dependencies {     // ShapeView:https://github.com/getActivity/ShapeView     implementation 'com.github.getActivity:ShapeView:9.2'     // ShapeDrawable:https://github.com/getActivity/ShapeDrawable     implementation 'com.github.getActivity:ShapeDrawable:3.2' }

AndroidX 兼容

  • 如果项目是基于 AndroidX 包,请在项目 gradle.properties 文件中加入

# 表示将第三方库迁移到 AndroidX android.enableJetifier = true

  • 如果项目是基于 Support 包则不需要加入此配置

框架文档

  • Java 代码设置

ShapeButton shapeButton = findViewById(R.id.btn_main_test); shapeButton.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View v) {              shapeButton.getShapeDrawableBuilder()                 .setSolidColor(0xFF000000)                 .setStrokeColor(0xFF5A8DDF)                 // 注意:最后需要调用一下 intoBackground 方法才能生效                 .intoBackground();         shapeButton.getTextColorBuilder()                 .setTextColor(0xFFFFFFFF)                 // 注意:最后需要调用一下 intoTextColor 方法才能生效                 .intoTextColor();         shapeButton.setText("颜色已经改变啦");     } });


布局属性大全


<resources>    <!-- Shape 形状(默认是矩形) -->
    <attr name="shape_type">        <!-- 矩形 -->
        <enum name="rectangle" value="0" />        <!-- 椭圆形 -->
        <enum name="oval" value="1" />        <!-- 线条 -->
        <enum name="line" value="2" />        <!-- 圆环 -->
        <enum name="ring" value="3" />
    </attr>    
    <!-- Shape 宽度 -->
    <attr name="shape_width" format="dimension" />    <!-- Shape 高度 -->
    <attr name="shape_height" format="dimension" />    <!-- 圆角大小 -->
    <attr name="shape_radius" format="dimension" />    <!-- 左上角的圆角大小 -->
    <attr name="shape_radiusInTopLeft" format="dimension" />
    <attr name="shape_radiusInTopStart" format="dimension" />    <!-- 右上角的圆角大小 -->
    <attr name="shape_radiusInTopRight" format="dimension" />
    <attr name="shape_radiusInTopEnd" format="dimension" />    <!-- 左下角的圆角大小 -->
    <attr name="shape_radiusInBottomLeft" format="dimension" />
    <attr name="shape_radiusInBottomStart" format="dimension" />    <!-- 右下角的圆角大小 -->
    <attr name="shape_radiusInBottomRight" format="dimension" />
    <attr name="shape_radiusInBottomEnd" format="dimension" />    <!-- 填充色(默认状态) -->
    <attr name="shape_solidColor" format="color" />    <!-- 填充色(按下状态) -->
    <attr name="shape_solidPressedColor" format="color" />    <!-- 填充色(选中状态) -->
    <attr name="shape_solidCheckedColor" format="color" />    <!-- 填充色(禁用状态) -->
    <attr name="shape_solidDisabledColor" format="color" />    <!-- 填充色(焦点状态) -->
    <attr name="shape_solidFocusedColor" format="color" />    <!-- 填充色(选择状态) -->
    <attr name="shape_solidSelectedColor" format="color" />    <!-- 填充色渐变色起始颜色 -->
    <attr name="shape_solidGradientStartColor" format="color" />    <!-- 填充色渐变色中间颜色(可不设置) -->
    <attr name="shape_solidGradientCenterColor" format="color" />    <!-- 填充色渐变色结束颜色 -->
    <attr name="shape_solidGradientEndColor" format="color" />    <!-- 填充色渐变方向(仅用于线性渐变) -->
    <attr name="shape_solidGradientOrientation" >        <!-- 从左到右绘制渐变(0 度) -->
        <enum name="leftToRight" value="0" />
        <enum name="startToEnd" value="10" />        <!-- 从右到左绘制渐变(180 度) -->
        <enum name="rightToLeft" value="180" />
        <enum name="endToStart" value="1800" />        <!-- 从下到上绘制渐变(90 度) -->
        <enum name="bottomToTop" value="90" />        <!-- 从上到下绘制渐变(270 度) -->
        <enum name="topToBottom" value="270" />        <!-- 从左上角到右下角绘制渐变(315 度) -->
        <enum name="topLeftToBottomRight" value="315" />
        <enum name="topStartToBottomEnd" value="3150" />        <!-- 从左下角到右上角绘制渐变(45 度) -->
        <enum name="bottomLeftToTopRight" value="45" />
        <enum name="bottomStartToTopEnd" value="450" />        <!-- 从右上角到左下角绘制渐变(225 度) -->
        <enum name="topRightToBottomLeft" value="225" />
        <enum name="topEndToBottomStart" value="2250" />        <!-- 从右下角到左上角绘制渐变(135 度) -->
        <enum name="bottomRightToTopLeft" value="135" />
        <enum name="bottomEndToTopStart" value="1350" />
    </attr>    <!-- 填充色渐变类型(默认类型是线性渐变) -->
    <attr name="shape_solidGradientType">        <!-- 线性渐变 -->
        <enum name="linear" value="0" />        <!-- 径向渐变 -->
        <enum name="radial" value="1" />        <!-- 扫描渐变 -->
        <enum name="sweep"  value="2" />
    </attr>    <!-- 填充色渐变中心 X 点坐标的相对位置(默认值为 0.5)-->
    <attr name="shape_solidGradientCenterX" format="float|fraction" />    <!-- 填充色渐变中心 Y 点坐标的相对位置(默认值为 0.5)-->
    <attr name="shape_solidGradientCenterY" format="float|fraction" />    <!-- 填充色渐变色半径(仅用于径向渐变) -->
    <attr name="shape_solidGradientRadius" format="float|fraction|dimension" />    <!-- 边框色(默认状态) -->
    <attr name="shape_strokeColor" format="color" />    <!-- 边框色(按下状态) -->
    <attr name="shape_strokePressedColor" format="color" />    <!-- 边框色(选中状态) -->
    <attr name="shape_strokeCheckedColor" format="color" />    <!-- 边框色(禁用状态) -->
    <attr name="shape_strokeDisabledColor" format="color" />    <!-- 边框色(焦点状态) -->
    <attr name="shape_strokeFocusedColor" format="color" />    <!-- 边框色(选择状态) -->
    <attr name="shape_strokeSelectedColor" format="color" />    <!-- 边框色渐变色起始颜色 -->
    <attr name="shape_strokeGradientStartColor" format="color" />    <!-- 边框渐变色中间颜色(可不设置) -->
    <attr name="shape_strokeGradientCenterColor" format="color" />    <!-- 边框渐变色结束颜色 -->
    <attr name="shape_strokeGradientColor" format="color" />    <!-- 边框色渐变方向(仅用于线性渐变) -->
    <attr name="shape_strokeGradientOrientation" >        <!-- 从左到右绘制渐变(0 度) -->
        <enum name="leftToRight" value="0" />
        <enum name="startToEnd" value="10" />        <!-- 从右到左绘制渐变(180 度) -->
        <enum name="rightToLeft" value="180" />
        <enum name="endToStart" value="1800" />        <!-- 从下到上绘制渐变(90 度) -->
        <enum name="bottomToTop" value="90" />        <!-- 从上到下绘制渐变(270 度) -->
        <enum name="topToBottom" value="270" />        <!-- 从左上角到右下角绘制渐变(315 度) -->
        <enum name="topLeftToBottomRight" value="315" />
        <enum name="topStartToBottomEnd" value="3150" />        <!-- 从左下角到右上角绘制渐变(45 度) -->
        <enum name="bottomLeftToTopRight" value="45" />
        <enum name="bottomStartToTopEnd" value="450" />        <!-- 从右上角到左下角绘制渐变(225 度) -->
        <enum name="topRightToBottomLeft" value="225" />
        <enum name="topEndToBottomStart" value="2250" />        <!-- 从右下角到左上角绘制渐变(135 度) -->
        <enum name="bottomRightToTopLeft" value="135" />
        <enum name="bottomEndToTopStart" value="1350" />
    </attr>    <!-- 边框大小 -->
    <attr name="shape_strokeSize" format="dimension" />    <!-- 边框虚线大小(为 0 就是实线,大于 0 就是虚线) -->
    <attr name="shape_strokeDashSize" format="dimension" />    <!-- 边框虚线间隔(虚线与虚线之间的间隔) -->
    <attr name="shape_strokeDashGap" format="dimension" />    <!-- 阴影大小 -->
    <attr name="shape_shadowSize" format="dimension" />    <!-- 阴影颜色 -->
    <attr name="shape_shadowColor" format="color" />    <!-- 阴影水平偏移 -->
    <attr name="shape_shadowOffsetX" format="dimension" />    <!-- 阴影垂直偏移 -->
    <attr name="shape_shadowOffsetY" format="dimension" />    <!-- 内环的半径(仅在 shape="ring" 生效) -->
    <attr name="shape_ringInnerRadiusSize" format="dimension" />    <!-- 内环的半径比率(仅在 shape="ring" 生效),计算公式:整个圆环 / innerRadiusRatio = innerRadius -->
    <attr name="shape_ringInnerRadiusRatio" format="float" />    <!-- 外环的厚度(仅在 shape="ring" 生效) -->
    <attr name="shape_ringThicknessSize" format="dimension" />    <!-- 外环的厚度比率(仅在 shape="ring" 生效),计算公式:整个圆环 / thicknessRatio = thickness -->
    <attr name="shape_ringThicknessRatio" format="float" />    <!-- 线条重心(仅在 shape="line" 生效) -->
    <attr name="shape_lineGravity">
        <flag name="top" value="0x30" />
        <flag name="bottom" value="0x50" />
        <flag name="left" value="0x03" />
        <flag name="right" value="0x05" />
        <flag name="start" value="0x00800003" />
        <flag name="end" value="0x00800005" />
        <flag name="center" value="0x11" />
    </attr>    <!-- 文本色(默认状态) -->
    <attr name="shape_textColor" format="color" />    <!-- 文本色(按下状态) -->
    <attr name="shape_textPressedColor" format="color" />    <!-- 文本色(选中状态) -->
    <attr name="shape_textCheckedColor" format="color" />    <!-- 文本色(禁用状态) -->
    <attr name="shape_textDisabledColor" format="color" />    <!-- 文本色(焦点状态) -->
    <attr name="shape_textFocusedColor" format="color" />    <!-- 文本色(选择状态) -->
    <attr name="shape_textSelectedColor" format="color" />    <!-- 文本渐变色起始颜色 -->
    <attr name="shape_textStartColor" format="color" />    <!-- 文本渐变色中间颜色(可不设置) -->
    <attr name="shape_textCenterColor" format="color" />    <!-- 文本渐变色结束颜色 -->
    <attr name="shape_textEndColor" format="color" />    <!-- 文本渐变方向(默认类型是水平渐变) -->
    <attr name="shape_textGradientOrientation">        <!-- 水平渐变 -->
        <enum name="horizontal" value="0" />        <!-- 垂直渐变 -->
        <enum name="vertical" value="1" />
    </attr>    <!-- 文本边框颜色 -->
    <attr name="shape_textStrokeColor" format="color" />    <!-- 文本边框大小 -->
    <attr name="shape_textStrokeSize" format="dimension" />    <!-- CheckBox 或者 RadioButton 图标(默认状态) -->
    <attr name="shape_buttonDrawable" format="reference" />    <!-- CheckBox 或者 RadioButton 图标(按下状态) -->
    <attr name="shape_buttonPressedDrawable" format="reference" />    <!-- CheckBox 或者 RadioButton 图标(选中状态) -->
    <attr name="shape_buttonCheckedDrawable" format="reference" />    <!-- CheckBox 或者 RadioButton 图标(禁用状态) -->
    <attr name="shape_buttonDisabledDrawable" format="reference" />    <!-- CheckBox 或者 RadioButton 图标(焦点状态) -->
    <attr name="shape_buttonFocusedDrawable" format="reference" />    <!-- CheckBox 或者 RadioButton 图标(选择状态) -->
    <attr name="shape_buttonSelectedDrawable" format="reference" />

</resources>


  • 目前支持这些属性的控件有:

    • View 的子类:ShapeView、ShapeTextView、ShapeButton、ShapeImageView、ShapeRadioButton、ShapeCheckBox、ShapeEditText

    • ViewGroup 的子类:ShapeLinearLayout、ShapeFrameLayout、ShapeRelativeLayout、ShapeConstraintLayout、ShapeRecyclerView、ShapeRadioGroup


框架混淆规则

  • 在混淆规则文件 proguard-rules.pro 中加入

-keep class com.hjq.shape.** {*;}


通过这些就可以方便地入项目中去了

如果您想要更多实用的开源项目,欢迎关注我的公众号:莫雨莫语,也可以扫描下方的二维码,我将会在每天带来一些实用的开源项目

来源: 互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

  • 置顶 开发项目接单群,免费入群了

    无论你是Android、ios、java、php,或者你是产品经理、老板,都可以免费入群接单或者发布项目,全程不收取任何费用。

    2025年02月21日 15点27分
  • 鸿蒙Next-AttributeModifier结合@Styles和@Extend深度解析使用

    声明式语法引入了@Styles和@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

    2025年03月03日 15点40分
  • ConstraintLayout之layout_constraintDimensionRatio属性详解

    layout_constraintDimensionRatio 是 ConstraintLayout 提供的一个强大功能,它可以让 View 按照固定的宽高比例自适应尺寸。使用这个属性,可以在 ConstraintLayout 中根据已知的宽度或高度,自动计算另一个维度,确保 View 保持特定的宽高比。

    2025年03月03日 15点39分
  • Android事件分发时,你浓眉大眼的onTouch()竟然没有执行?

    在开发需求时,有这么一个场景:Activity中有一个ViewGroup作为Parent,ViewGroup里面又有一个Webview作为Child。当一进入页面时,系统输入法自动弹起,而在点击Parent区域时,需要收起系统输入法。背景介绍完毕,当时的第一想法就是通过Parent设置setOnTouchListener,然后在onTouch()回调中来实现:

    2025年03月02日 15点10分
  • Android SDK封装与发布实战指南

    Android SDK封装与发布实战指南

    2025年03月02日 15点05分
  • 鸿蒙Next开发-添加水印以及点击穿透设置

    在鸿蒙Next中,为App全局添加水印可以通过以下方式实现,其中通过窗口添加水印是一种常见且高效的方式。以下是具体方案和实现细节:

    2025年02月26日 23点15分
  • 鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    2025年02月26日 23点14分
  • 深入探索ArkUI @Builder与@BuilderParam的进阶应用

    在ArkUI的组件化开发体系中,@Builder和@BuilderParam这对装饰器组合扮演着UI模块化的重要角色。二者的差异与配合体现了声明式UI的核心思想:

    2025年02月26日 23点12分
  • Deepseek推荐:Android 开发者需要掌握的系统知识大纲

    一、操作系统基础1. Linux 内核机制内容介绍 Android 基于 Linux 内核,核心机制包括进程管理、内存管理、文件系统、Binder 驱动等。

    2025年02月26日 23点09分
  • Android App 厂商角标适配

    本篇介绍一下笔者在维护IM应用时,设置App角标的相关经验。同时这里设置角标都是基于系统厂商的Launcher,没有适配三方的Launcher应用,因为我们统计下来发现近些年使用三方Launcher应用比较少了,大部分用户还是以系统Launcher为主。所在在我们的项目中,主要是适配各个厂商。

    2025年02月26日 23点07分
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现

    以下是关于 鸿蒙Next(HarmonyOS NEXT)中 MethodDecorator 的详细介绍及使用指南,结合了多个技术来源的实践总结:

    2025年02月26日 22点58分
  • DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

    DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键:

    2025年02月26日 22点56分
  • Android | 利用ItemDecoration绘制RecyclerView分割线

    RecyclerView.ItemDecoration 是 Android 提供的一种扩展机制,用于为 RecyclerView 的每个子项(Item)添加装饰(Decoration)。它通常用于绘制分割线、边距、背景等,目的是增强 RecyclerView 的显示效果。

    2025年02月26日 22点52分
  • Android 布局优化:利用 ViewStub 和 Merge 提升性能

    提升界面渲染性能是一个至关重要的任务,尤其是在应用启动时,渲染界面需要快速且流畅。为了优化 UI 渲染速度,Android 提供了许多工具,其中 ViewStub 和 Merge 标签是非常有效的布局优化手段。通过合理使用这两者,可以延迟加载不必要的视图、减少布局的嵌套层级,从而加速应用的启动和运行。

    2025年02月26日 22点47分
  • 玩转 ImageView.ScaleType:图片的缩放与裁剪技巧

    ImageView 是最常用的控件之一,它用于展示各种类型的图片。为了能够根据需求调整图片的显示效果,Android 提供了 ImageView.ScaleType 枚举,它可以灵活地控制图片如何适应 ImageView 的尺寸。本文将探讨 ImageView.ScaleType 的不同选项、使用场景及其实现技巧。

    2025年02月26日 22点45分
  • Android加快你的编译速度

    工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。

    2025年02月25日 15点40分

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:dxmcpjl

    邮件:1529097251#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信