Android Switch开关按钮使用和自定义样式(系列教程五)

news2024/12/23 14:02:14

Switch开关按钮简介

Switch开关按钮是Android中的基本控件之一,其本质上也是一个按钮,具有开和关两种展示状态。

Switch开关按钮基本使用

在布局文件中定义开关按钮:

<LinearLayout
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:orientation="vertical">

        <Switch
            android:id="@+id/swtTest"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

下面是开关按钮的默认样式,比较丑,我们后面自定义比较好看的开关按钮。 

 在Activity中使用开关按钮:

 Switch开关按钮本质上也是一个按钮,也具有对onClick、onLongClick、onTouch事件的处理能力,但它又是一个特殊的按钮,拥有一个特殊的事件,可以监听开关按钮的状态变化,如下所示:

public class MainActivity05 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_05);

        //根据ID获取到开关按钮
        Switch swtTest = findViewById(R.id.swtTest);

        //给开关按钮设置监听状态改变事件
        swtTest.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                System.out.println("开关按钮的状态 = " + b);
            }
        });
    }
}

Switch开关按钮属性介绍

  • textOn:开关按钮打开时显示的文字。
  • textOff:开关按钮关闭时显示的文字。
  • thumb:开关按钮上原型滑块的样式,自定义样式时需要设置此样式。
  • track:开关按钮下面导轨的样式,自定义样式时需要设置此样式。
  • switchTextAppearance:设置文本的风格,可以用来设置开关两种状态下的文本样式。
  • checked:设置初始选中状态
  • showText:设置是否显示开关上的文字(android系统中默认不显示)

Switch开关按钮自定义样式

自定义样式效果图如下,下面我们一步步去实现这个样式。

 1. 定义开关按钮底部导轨的样式:drawable/track.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--开关按钮关闭时的导轨样式-->
    <item android:state_checked="false">
        <shape>
            <size android:height="@dimen/switchHeight" android:width="@dimen/switchWidth"></size>
            <corners android:radius="20dp"></corners>
            <solid android:color="#b353667c"></solid>
            <stroke android:color="#b3ffffff" android:width="1dp"></stroke>
        </shape>
    </item>

    <!--开关按钮打开时的导轨样式-->
    <item android:state_checked="true">
        <shape>
            <size android:height="@dimen/switchHeight" android:width="@dimen/switchWidth"></size>
            <corners android:radius="20dp"></corners>
            <solid android:color="#b32881d5"></solid>
            <stroke android:color="#b3ffffff" android:width="1dp"></stroke>
        </shape>
    </item>
</selector>

 2. 定义开关按钮上滑块的样式:drawable/thumb.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false">
        <layer-list>
            <item android:width="@dimen/switchHeight" android:height="@dimen/switchHeight">
                <shape android:shape="oval">
<!--                    <solid android:color="#b3536673"></solid>-->
                </shape>
            </item>

            <item android:left="@dimen/thumbOffset" android:right="@dimen/thumbOffset" android:top="@dimen/thumbOffset" android:bottom="@dimen/thumbOffset">
                <shape android:shape="oval">
<!--                    <size android:height="30dp" android:width="30dp"></size>-->
                    <solid android:color="#b3536673"></solid>
                    <stroke android:width="1dp" android:color="#b3ffffff"></stroke>
                </shape>
            </item>
        </layer-list>
    </item>

    <item android:state_checked="true">
        <layer-list>
            <item android:width="@dimen/switchHeight" android:height="@dimen/switchHeight">
                <shape android:shape="oval">
                    <!--                    <solid android:color="#b3536673"></solid>-->
                </shape>
            </item>

            <item android:left="@dimen/thumbOffset" android:right="@dimen/thumbOffset" android:top="@dimen/thumbOffset" android:bottom="@dimen/thumbOffset">
                <shape android:shape="oval">
                    <solid android:color="#b3536673"></solid>
                    <stroke android:width="1dp" android:color="#b3ffffff"></stroke>
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

3. 定义开关时的字体样式:values/style.xml

<style name="switchStyleDefault" parent="@style/TextAppearance.AppCompat.Widget.Switch">
        <item name="android:textSize">10sp</item>
        <item name="android:textColor">#ffffff</item>
    </style>

    <style name="switchStyleCheck" parent="@style/TextAppearance.AppCompat.Widget.Switch">
        <item name="android:textSize">10sp</item>
        <item name="android:textColor">#00ff0a</item>
    </style>

4. 需要在代码中根据按钮状态设置字体样式。

//给开关按钮设置监听状态改变事件
        swtTest.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                System.out.println("开关按钮的状态 = " + b);

                //设置改变字体颜色
                swtTest.setSwitchTextAppearance(MainActivity05.this, b ? R.style.switchStyleCheck : R.style.switchStyleDefault);
            }
        });

5. 最后,看一下布局中Switch开关按钮属性的设置,都引用了我们前面定义的样式。

<Switch
                    android:id="@+id/swtAutoModel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="10dp"
                    android:layout_toRightOf="@id/textView5"
                    android:showText="true"
                    android:switchMinWidth="50dp"
                    android:switchTextAppearance="@style/switchStyleDefault"
                    android:textOff="异物"
                    android:textOn="导线"
                    android:thumb="@drawable/thumb"
                    android:track="@drawable/track" />

至此,Switch开关按钮自定义样式已经实现。

原创不易,点个赞再走呗。。。

 

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

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

相关文章

Vivado安装后添加器件库

1.前言 通常安装Vivado时&#xff0c;由于软件完整安装的空间需求过于庞大&#xff0c;一般只会选择一部分器件进行安装。而随着学习和工作的进展&#xff0c;遇到新的赛灵思朋友是成长的里程碑&#xff0c;也是综合不能通过的绊脚石。 今天有幸认识了一位新的赛灵思朋友——…

云原生: istio+dapr构建多运行时服务网格

2020 年&#xff0c;Bilgin Ibryam 提出了 Multi-Runtime&#xff08;多运行时&#xff09;的理念&#xff0c;对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华。那到底什么是多运行时呢&#xff1f;首先还是得从分布式应用的四大类基本需求讲起。简单来讲任何分布…

刷题练习3

文章目录 题目一分析题解 题目二分析第一种第二种 题解第一种方法代码第二种方法代码 题目一 题目链接 描述 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 输入描述&#xff1a; 个测试输入包含1个测试用例&#xff0c;一个字符串str&#xff0c;长度不超…

牛顿迭代法解超越方程

牛顿迭代法解超越方程 L g T 2 2 π t a n h ( 2 π L d ) L\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d) L2πgT2​tanh(L2π​d) 方程&#xff1a; f ( L ) L − g T 2 2 π t a n h ( 2 π L d ) 0 f(L)L-\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d)0 f(L)L−2πgT2​tanh(L2π…

~项目启动~

rmq是什么&#xff1f; "rmq" 可能指的是 "RabbitMQ"&#xff0c;它是一种开源消息队列软件&#xff0c;采用 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;可以用于支持异步处理、任务分发、解耦合等应用场景。Rabbit…

仪表检测与读数(一):仪表检测

基于YOLOv4的仪表检测 前言YOLOv4源码下载数据集处理与模型训练模型性能测试 前言 本系列是想记录一下自己实现的一种用于仪表检测与读数的方法&#xff0c;首先方法仅针对于单指针仪表和单行显示的数字仪表进行了检测与读数方法的设计。方法的整体思路是&#xff1a;第一步对拍…

[ 云计算 | Azure ] Chapter 06 | 计算服务之虚拟机、虚拟机规模集、Azure 容器、Azure App 与 Azure Functions

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

【Qt】插件Plugin入门之Q_PLUGIN_METADATA()宏【2023.05.07】

摘要 分析Q_PLUGIN_METADATA宏的设计意图&#xff0c;站在设计者的意图进行插件的高屋建瓴式学习。 Meta-Object Compiler 简称MOC Qt 的 Meta-Object Compiler&#xff08;MOC&#xff09;是一个预处理器&#xff0c;用于处理带有特殊关键字的 C 文件&#xff0c;并生成用于…

Linux命令·netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 如果你的计算机有时候…

详细版简单易学版TypeScript各类型声明

假如本地新建了一个b.ts文件 安装TypeScript&#xff1a;npm install -g typescript 编译代码&#xff1a;tsc b.ts 运行js&#xff1a;node b.js 在终端输入 tsc -init 生成 tsconfig.json 文件 类型注解&#xff1a;TypeScript里的类型注解是一种轻量级的为函数或变量添加约束…

Python中模块和包基础学习

目录 模块 引入模块 使用from...import语句引入模块中的指定变量或函数 使用import...as语句给模块起别名 使用dir()函数查看模块中的所有变量和函数 使用__name__变量判断模块是被导入还是直接执行 包 注意 示例 模块 Python中的模块是指一个文件&#xff0c;可以包…

2.1 掌握NumPy数组对象ndarray

2.1 掌握NumPy数组对象ndarray 2.2.1 创建数组对象1&#xff0e;数组创建2&#xff0e;数组属性&#xff1a;ndarray&#xff08;数组&#xff09;是存储单一数据类型的多维数组。3&#xff0e;数组数据类型 2.1.2 生成随机数random模块常用随机数生成函数 2.1.3 通过索引访问数…

Python中异常处理的学习

目录 异常的基本介绍 异常处理语句 抛出异常 异常的基本介绍 在Python中&#xff0c;如果程序出现错误&#xff0c;会抛出异常。异常是一种Python对象&#xff0c;它封装了错误的信息&#xff0c;并提供了一种处理错误的机制。Python中内置了很多异常类型&#xff0c;包括但…

C语言-学习之路-07

C语言-学习之路-07 内存管理作用域局部变量静态&#xff08;static&#xff09;局部变量全局变量extern全局变量声明全局函数和静态函数 内存分布内存分区 内存管理 作用域 C语言中变量的作用域可分为&#xff1a;代码作用域、函数作用域、文件作用域 局部变量 局部变量也叫…

C嘎嘎~~ [类 下篇(2)]

类 下篇2 5.赋值运算符重载5.1运算符重载5.1.1 运算符的概念5..1.2 重载运费符的位置5.1.3运算符重载的实质 5.2 赋值运算符重载5.2.1深刻理解---编译器生成的默认赋值运算符重载5.2.2深刻理解---拷贝构造和赋值运算符重载5.2.3深刻理解---传参和返回值用引用修饰 5.赋值运算符…

ADAS-透视前方:汽车HUD技术原理解析

“ 当人们谈论未来的汽车技术时&#xff0c;汽车HUD&#xff08;Head-Up Display&#xff09;是一个经常被提及的技术。HUD是一种驾驶辅助技术&#xff0c;它可以将关键的驾驶信息直接显示在驾驶员的视线范围内&#xff0c;让驾驶员无需转移视线就能获得所需信息。这个技术在过…

HZNUCTF2023 web

目录 <1> guessguessguess <2> ezflask(无过滤ssti) ​ <3> ppppop(cookie泄露反序列化) <4> ezlogin(bool盲注) <5> ezpickle(pickle反序列化) <6> eznode(原型链污染) <1> guessguessguess 尝试是否存在sql注入&#xff0c;…

03- 目标检测数据集和标注工具介绍 (目标检测)

要点&#xff1a; 常用数据集和标注工具 标注工具 PPOCRLabel github地址&#xff1a;paddleocrlabel 参考文档&#xff1a;目标检测简介 - 知乎 一 目标检测数据集 1. PASCAL VOC VOC数据集是目标检测经常用的一个数据集&#xff0c;自2005年起每年举办一次比赛&#xff…

JWT快速入门及日常使用

什么是JWT JSON Web Token&#xff0c;通过数字签名的方式&#xff0c;以json对象为载体&#xff0c;在不同服务端之间安全的传输信息 JWT有什么用 JWT最常见的场景就是授权认证&#xff0c;一旦用户登录&#xff0c;后续每个请求都将包含JWT&#xff0c;系统每次处理用户请求前…

总结下自己编译alembic的过程

编译alembic过程回顾 前言 总结下自己编译alembic的过程 最近想学习编译啥的&#xff0c;就想着一边编译着&#xff0c;一边学习的&#xff0c;刚好&#xff0c;拿alembic编译练手&#xff0c;记录下自己编译的过程吧。 编译的使用的是Visual Studio 2022&#xff0c;python…