重铸安卓荣光——复选框ButtonCheckBox

痛点:

公司打算做安卓软件,最近在研究安卓,打算先绘制样式

研究发现安卓并不像前端有那么多组件库,甚至有些基础的组件都需要自己实现,记录一下自己实现的组件

成品展示

一个复选框样式

选中时背景橙色,带有橙色钩子

未选中时背景白色,取消钩子

复选框

思路

因为这个复选框要在外边框的右下角,所以选择用RelativeLayout来包裹一个TextView和一个CheckBox

TextView用来显示文字,CheckBox用来显示右下角的复选框

图像准备

在正式开始写代码之前,需要先准备几个样式

外边框

选中状态

checkbox_backgroud_checked.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#30FFA500"/><!-- 指定了形状轮廓的粗细与颜色 --><strokeandroid:width="1dp"android:color="#FFA500" /><!-- 指定了形状四个圆角的半径 --><corners android:radius="5dp" />
</shape>

未选中状态

checkbox_backgroud_uncheck.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="@color/white"/><!-- 指定了形状轮廓的粗细与颜色 --><strokeandroid:width="1dp"android:color="@color/viewfinder_text_color4" /><!-- 指定了形状四个圆角的半径 --><corners android:radius="5dp" />
</shape>

复选框

复选框也需要指定选中和未选中的背景

选中状态

circle_checkbox_checked.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="15dp"android:height="15dp"android:tint="@color/orange"android:viewportWidth="24"android:viewportHeight="24"><pathandroid:fillColor="@android:color/white"android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" />
</vector>

未选中状态

circle_checkbox_uncheck.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="15dp"android:height="15dp"android:viewportWidth="24"android:viewportHeight="24"><!-- 灰色边框 --><pathandroid:fillColor="@android:color/transparent"android:strokeColor="#30000000"android:strokeWidth="1"android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z" />
</vector>

选择器

checkbox_circle_selector.xml

选择器时用来设置复选框选中和未选中的样式

<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/circle_checkbox_checked_15" android:state_checked="true" /><item android:drawable="@drawable/circle_checkbox_uncheck_15" android:state_checked="false" />
</selector>

实现

首先来配置属性,在res/values/attrs.xml中添加配置

enable:用来表示选中状态

text:用来展示文字

    <declare-styleable name="ButtonCheckBox"><attr name="enable" format="boolean" /><attr name="text" format="string" /></declare-styleable>

具体代码

ButtonCheckBox.java

public class ButtonCheckBox extends RelativeLayout {private boolean enable;private String value;public ButtonCheckBox(Context context) {super(context);}public ButtonCheckBox(Context context, AttributeSet attrs) {super(context, attrs);//获取初始化属性TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ButtonCheckBox);enable = a.getBoolean(R.styleable.ButtonCheckBox_enable, false);value = a.getString(R.styleable.ButtonCheckBox_text);a.recycle();init();}public ButtonCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public ButtonCheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}public void init(){//自身setBackgroundResource(R.drawable.checkbox_backgroud_uncheck);//文字组件TextView valueView = new TextView(getContext());valueView.setText(value);valueView.setTextColor(Color.BLACK);RelativeLayout.LayoutParams valueViewLayoutParams =new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);valueViewLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);valueView.setLayoutParams(valueViewLayoutParams);//checkboxCheckBox checkBox = new CheckBox(getContext());checkBox.setButtonDrawable(R.drawable.checkbox_circle_selector_15);RelativeLayout.LayoutParams checkBoxLayoutParams =new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);checkBoxLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);checkBoxLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);checkBoxLayoutParams.setMargins(0,0,2,2);checkBox.setLayoutParams(checkBoxLayoutParams);//点击事件setOnClickListener(v -> checkBox.setChecked(!enable));//监听checkbox变化checkBox.setOnCheckedChangeListener((buttonView,isChecked) -> {enable = isChecked;if (isChecked) {//选中状态valueView.setTextColor(Color.parseColor("#FFA500"));setBackgroundResource(R.drawable.checkbox_backgroud_checked);}else {valueView.setTextColor(Color.BLACK);setBackgroundResource(R.drawable.checkbox_backgroud_uncheck);}});addView(valueView);addView(checkBox);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1113626.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

升级到PHP8.X的原因和方法

上周有一个使用Hostease美国主机服务器多年的客户&#xff0c;反馈需要升级到PHP8.x&#xff0c;原因是站点程序已升级&#xff0c;并希望站点运行在更高也稳定的PHP8.x上。在升级PHP8.x的过程中&#xff0c;联系我们并反馈在升级过程中遇到了问题&#xff0c;需求解决方案。 升…

利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg

1、eps转pdf 直接使用epstopdf命令&#xff08;texlive、mitex自带&#xff09;。 在cmd中进入到eps矢量图片的目录&#xff0c;使用下面的命令&#xff1a; for %f in (*.eps) do epstopdf "%f" 下面是plt保存eps代码&#xff1a; import matplotlib.pyplot as…

新手学习Cesium的几点建议

Cesium是当前非常火热的三维数字地球开发框架&#xff0c;很多公司基于Cesium做项目以及形成了自己的产品&#xff0c;关于Cesium的学习&#xff0c;有诸多网站、书籍、学习资料甚至培训教材&#xff0c;这里不再详细推荐&#xff0c;从学习Cesium的角度&#xff0c;资料和教程…

Android14 InputManager-InputReader的处理

IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…

2.2 request的使用

目录 2.2.1、request简介 2.2.2、GET请求 1 GET请求返回对象的一些属性 2 params 参数 3 response.text的真面目 2.2.1、request简介 提供爬虫需要的函数 2.2.2、GET请求 1 GET请求返回对象的一些属性 import requestsurl https://www.baidu.com/ response requests.…

145. Binary Tree Postorder Traversal(二叉树的后序遍历)

问题描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 问题分析 此问题与二叉树的前序遍历分析类似&#xff0c;只是在数组合并的时候顺序发生一下变化就行了。 代码 int* postorderTraversal(struct TreeNode* root, int* returnSize) {if(root…

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…

黑马头条-day10

文章目录 app端文章搜索1、文章搜索1.1 ElasticSearch环境搭建1.2 索引库创建①需求分析②ES导入数据场景分析③创建索引和映射 1.3 索引数据同步①app文章历史数据导入ES②文章实时数据导入ES 1.4 文章搜索多条件复合查询①关键词搜索②搜索接口定义 2、搜索历史记录2.1 需求说…

SpringBoot原理篇

文章目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2.4 案例3.2…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么&#xff1f; ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人&#xff0c;它基于强大的语言处理模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;构建。它能够理解人类语言&#xff0c;可以为我们解决实际的问题。 1.模型规模…

Vue中 Runtime-Only和Runtime + Compiler的区别

在 Vue 项目中&#xff0c;Runtime-Only 和 Runtime Compiler 是两种不同的构建方式。 Runtime-Only&#xff08;仅运行时&#xff09;&#xff1a;在 Runtime-Only 构建中&#xff0c;Vue 库只包含运行时的代码&#xff0c;不包含模板编译器。。Runtime Compiler&#xff08…

【MySQL高可用集群】MySQL的MGR搭建

前情提要&#xff1a; MySQL官方在 5.7.17版本正式推出组复制&#xff08;MySQL Group Replication&#xff0c;简称MGR&#xff09;&#xff0c;使用类似 zookeeper 的多于一半原则。在一个集群由 2N1 个节点共同组成一个复制组&#xff0c;一个事务的提交&#xff0c;必须经过…

4.Spring MVC入门

文章目录 1. HTTP协议2. Spring MVC2.1. 三层架构2.2. MVC&#xff08;解决表现层的问题&#xff09;2.3. 核心组件 3. Thymeleaf3.1. 模板引擎3.2. Thymeleaf3.3. 常用语法 代码 1. HTTP协议 网址&#xff1a;https://www.ietf.org/ &#xff08;官网网址&#xff09; https:…

<网络安全>《44 网络攻防专业课<第十课 - OFFICE/PDF/压缩文件数据加密与解密>》

1 Office文件的加密 Microsoft Office 97~2003&#xff08;Access除外&#xff09;默认使用的是RC4 40 Bit加密方式 “修改文件时的密码”只是个字段&#xff0c;所以在能打开Office文档的情况下&#xff0c;许多破解软件都可以通过重置该字段的方法解除Office文档的只读限制…

合金电阻2512 0.01R是怎么应用在电池保护板中的

合金电阻2512 0.01R可以应用在电池保护板中的过流保护电路中。电池保护板用于监测和控制电池的充放电状态&#xff0c;以防止电池过充、过放和过流等情况&#xff0c;保护电池的安全和寿命。 过流保护电路是电池保护板的主要功能之一&#xff0c;用于检测电池输出电流是否超过安…

万界星空科技MES系统,实现数字化智能工厂

万界星空科技帮助制造型企业解决生产过程中遇到的生产过程不透明&#xff0c;防错成本高&#xff0c;追溯困难&#xff0c;品质不可控&#xff0c;人工效率低下&#xff0c;库存积压&#xff0c;交期延误等问题&#xff0c;从而达到“降本增效”的目标。打通各个信息孤岛&#…

一周学会Django5 Python Web开发-Django5命名空间namespace

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

数据结构:共用体+枚举

一、共用体 1.共用体中的所有成员&#xff0c;共享一片内存空间&#xff0c;成员的首地址都相同 2.共用体的大小&#xff0c;取决于共用体中成员大小更大的那个 3.一个成员的数据发生修改&#xff0c;另一个会跟着修改 1.定义 把定义结构体时的struct改成union即可 访问共…

Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端

目录 Socket TCP和UDP区别 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 TCP&#xff1a;有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 无连接和有连接 可靠传输和不可靠传输 面向数据报和面向字节流…