Android RedioButton、RadioGroup底部添加动画位移横线下划线

2023-05-16



最近公司做项目用到一个RadioGrop底部添加下划线的需求,索性封装一个工具类得了,
给能用的上的码农及懒得算的童鞋节约一点时间,如果感觉能用麻烦给点个赞不枉我辛苦一场。
不说了直接贴代码,代码我是测过了的,赶时间的直接复制
ImageViewAnimationHelper类。


在RadioGrop切换的时候直接调用startAnimation方法传入下标就行了,非常简单。
注意 : 构造中的moveNum和radioButton数量是对应的,不然距离会有问题
lineWithdp是线的宽度,高度是在布局中指定的。



public class ImageViewAnimationHelper {

private Context context;
private float lineWith;
private float moveNum;
private float oldMoveNum;
private float distance;
private float fromXDelta;
private float toXDelta;
private float oldXDelta;
private ImageView imageView;
private boolean isInit = true;

/**
 * 
 * @param context
 * @param imageView
 * @param moveNum 一共需要移动几次
 * @param lineWithdp 下划线的宽度,单位dp
 */
public ImageViewAnimationHelper(Context context, ImageView imageView, float moveNum, float lineWithdp) {
    this.context = context;
    this.moveNum = moveNum;
    this.imageView = imageView;
    this.lineWith = lineWithdp * context.getResources().getDisplayMetrics().density;
    init();
}

/**
 * 初始化
 */
private void init() {
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) imageView.getLayoutParams();
    //每段间隔距离
    float surplus = context.getResources().getDisplayMetrics().widthPixels - (lineWith * moveNum);
    distance = surplus / (moveNum * 2);
    params.width = (int) lineWith;
    imageView.setLayoutParams(params);
    //刷新
    imageView.requestLayout();
    startAnimation(0);
}

/***
 * 
 * @param moveNum 移动第几个 从0开始下标、不计间隔
 */
public void startAnimation(int moveNum) {

    if (moveNum > this.moveNum) {
        throw new RuntimeException("IndexOutOf Exception ");
    }

    //计算fromXDelta toXDelta
    if (oldMoveNum < moveNum | (oldMoveNum == 0 & isInit) | moveNum == 0) {//右移、初始化
        isInit = false;
        fromXDelta = oldXDelta;
        toXDelta = distance * (2 * moveNum) + lineWith * moveNum + distance;
        oldXDelta = toXDelta;
    } else {//左移
        fromXDelta = oldXDelta;
        toXDelta = distance * (2 * moveNum) + lineWith * moveNum + distance;
        oldXDelta = toXDelta;
    }

    oldMoveNum = moveNum;
    /**
     float fromXDelta 动画开始的点离当前View X坐标上的差值
     float toXDelta 动画结束的点离当前View X坐标上的差值
     float fromYDelta 动画开始的点离当前View Y坐标上的差值
     float toYDelta 动画开始的点离当前View Y坐标上的差值
     */
    Animation animation = new TranslateAnimation(fromXDelta, toXDelta, 0f, 0f);

    animation.setDuration(300);
    animation.setFillAfter(true);
    imageView.startAnimation(animation);
}

}



这里写图片描述


public class MainActivity extends AppCompatActivity {

ImageView instructionsIv;
RadioGroup collectionRadioGroup;

ImageViewAnimationHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_collection);
    instructionsIv = (ImageView) findViewById(R.id.instructionsIv);
    collectionRadioGroup = (RadioGroup) findViewById(R.id.collectionRadioGroup);

    helper = new ImageViewAnimationHelper(this, instructionsIv, 3, 100);
    collectionRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
            switch (i) {
                case R.id.collectionNewCarRb:
                    helper.startAnimation(0);
                    break;
                case R.id.collectionUsedCarRb:
                    helper.startAnimation(1);
                    break;
                case R.id.collectionServiceCarRb:
                    helper.startAnimation(2);
                    break;
            }
        }
    });
}

}


实现后的效果图

话说离丈女娘的距离就是一座房子,苦逼的码农哟!

搞定!轻松加愉快(#^.^#)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android RedioButton、RadioGroup底部添加动画位移横线下划线 的相关文章

  • 不同方式输出九九乘法表(java)

    方式一 xff1a System out println 34 打印正方形 34 正方形 for int i 61 1 i lt 61 9 i 43 43 外层循环控制行 for int j 61 1 j lt 61 9 j 43 43 内
  • Blazor Json Web Token 身份验证与授权

    Blazor 身份验证与授权 身份验证 Blazor Server应用和 Blazor WebAssembly 应用的安全方案有所不同 Blazor WebAssembly Blazor WebAssembly 应用在客户端上运行 由于用户
  • 编程之美读书笔记_3.3_计算字符串的相似度

    3 3 计算字符串的相似度 和计算两字符串的最长公共子序列相似 设Ai 为字符串A a1a2a3 am 的前i 个字符 xff08 即为a1 a2 a3 ai xff09 设Bj 为字符串B b1b2b3 bn 的前j 个字符 xff08
  • vxworks 开发环境搭建

    安装指南 1 安装VxWorks6 9 xff08 光盘文件是DVD R147826 1 1 01 vx69 udf iso xff09 1 不要选择两个check 选项 xff0c 可以节省不必要的时间 xff1b 2 Next 到如图
  • ffmpeg调用avformat_open_input打开rtmp转发流阻塞

    G28181协议接入时 xff0c 为了减少视频处理服务的改动 xff0c 故采用了rtmp转发的方案 使用nginx搭建rtmp转发服务器 xff0c 设备代理将流推送给nginx xff0c nginx再将流转发给视频处理服务 但设备代
  • 交叉编译一个能在mips下运行的vim编译器

    有了交叉编译环境 xff0c 下一步就能在我的路由器和光猫上搞更多的事情了 我的目标是编译出能够在路由器上运行的二进制程序 1 对交叉编译的理解 什么是交叉编译 xff1f 我们常用的路由器 光猫 电视盒等等都运行着一个系统 xff0c 它
  • CAP 定理的含义

    CAP 定理的含义 作者 xff1a 阮一峰 日期 xff1a 2018年7月16日 分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 x
  • boost::any实现解析

    忘记当初具体想做什么了 xff0c 只记得要求 xff1a 将各种类型 xff08 如int xff0c char xff0c float xff0c 自定义类型等 xff09 放到一个容器里 这样的要求 xff0c 目前stl的任何容器都
  • 程序性能优化工具——gprof

    gprof是程序性能分析的一个重要工具 xff0c 通过gprof工具可以获取程序中函数之间的调用关系 xff0c 每个函数的调用次数 xff0c 及函数的消耗时间 xff0c 从而为程序性能优化指明方向 由此也可以推断出 xff0c 一个
  • 程序性能优化之分支预测

    程序是由多条指令构成的 xff0c 程序的运行便是cpu一条一条执行程序指令的过程 一条指令的执行过程大致可以分为加载指令 xff0c 翻译指令 xff0c 加载数据 xff0c 执行运算 xff0c 更新数据几个阶段 xff0c 每个阶段
  • 初识valgrind

    valgrind是一款非常优秀的性能调试工具 xff0c 通过valgrind xff0c 可以完成以下几点工作 xff1a 1 Memcheck xff1a 内存错误检测 2 Cachegrind xff1a 缓存和分支预测分析 3 Ca
  • 服务运维-日志

    服务一般情况下运行在后台 xff0c 没有界面 xff0c 很难观察到服务的状态 因此 xff0c 对于服务运维 xff0c 日志变成了一个非常重要的工具 通过服务日志 xff0c 可以了解到服务的运行状态 xff0c 如服务是否正常运行
  • 如何查看cpu是否支持sse指令级

    Mac xff1a 命令 xff1a sysctl a grep machdep cpu features 结果 xff1a machdep cpu features FPU VME DE PSE TSC MSR PAE MCE CX8 A
  • Mac系统下VSCode配置gopath

    golang项目的编译和调试依赖gopath 命令行可以通过export为每个golang项目导出不同的gopath xff0c 使用VSCode也可以通过配置 xff0c 实现不同的golang项目使用不同gopath xff0c 步骤如
  • GDB打印vector指定元素

    使用GDB调试程序时 xff0c 需要查看变量的值 对于普通变量 xff0c 直接使用p命令即可 xff0c 如下 xff1a 对于vector xff0c 也可以使用相同的方法 xff0c 如下 xff1a vector元素较少时 xff
  • Linux中学教程(一)

    突然想写点关于linux的东西 xff0c 一是将自己几十年来零碎的知识作以串联 xff0c 二是能为正在学习路上的新手作些指引 而恰好作者的孩子是一位初一的学生 xff0c 我写的这些东西也正是我手把手教授他的 xff0c 现在分享出来并
  • libevent之eventop

    功能 xff1a IO处理模型 架构 xff1a 实现 xff1a event internal h定义eventop结构体 xff0c 在 c文件实例化生成对应的全局对象 xff0c 如在poll c中生成pollops对象 event
  • C++ Lambda表达式的使用方法

    C 43 43 Lambda表达式的简单实用方法如下 xff1a include lt functional gt include lt algorithm gt include lt iostream gt include lt list
  • Visual Code 配置golang开发环境

    1 去微软官网下载安装Visual Code http code visualstudio com Download 安装成功后 xff0c 打开命令行 xff0c 输入go version xff0c 会输出golang 版本 如果没有输
  • linux下调用mysql_query产生SIGSEGV段错误

    xfeff xfeff 程序需要用到MySQL来进行持久化 xff0c 代码在windows测试通过 xff0c 但在Linux调试时 xff0c 产生下面的异常 xff1a Thread 9 34 NodesManagerd 34 rec

随机推荐

  • vim编辑文档误用Ctrl+S导致vim假死

    xfeff xfeff 在linux使用vim编辑源码之后 xff0c 顺手使用了ctrl 43 s xff0c 本以为会保存源码 xff0c 但不料vim却卡住了 xff0c 怎么动都动不了 经过查询 xff0c 才发现ctrl 43 s
  • golang获取命令行参数

    xfeff xfeff 对于C C 43 43 java xff0c 或C 程序 xff0c 我们可以通过入口函数 xff08 main函数 xff09 直接获取命令行参数 xff1a int main int argc char argv
  • linux不指定LD_LIBRARY_PATH运行程序

    在windows中 xff0c 只要将动态库DLL跟可执行程序放在同一个目录 xff0c 程序在运行时 xff0c 就能找到DLL 然而 xff0c 在linux中 xff0c 必须指定动态库的路径 xff0c 程序才能找到动态库 xff0
  • bfs编译失败,编译gflags时缺少config.h

    在编译百度文件系统时 xff0c 编译失败 xff0c 错误如下 xff1a 进入到bfs thirdsrc gflags 2 1 1 include gflags xff0c 发现config h存在 于是跳到gflags 2 1 1 x
  • golang文件读取介绍

    golang提供了多种文件读取方式 xff0c 第一种方式 xff0c 也是最简单的一种方式 xff0c 如下 xff1a bytes err 61 ioutil ReadFile 34 a txt 34 if err 61 nil pan
  • zookeeper分布式部署

    在部署zookeeper之前 xff0c 先准备3台服务器 xff08 服务器已安装配置jdk xff09 xff1a node0 192 168 1 161 xff08 ubuntu16 04 xff09 node1 192 168 1
  • Linux中学教程--第1章 Centos8 开局N件事

    操作系统的学习 xff0c 最重要的是动手去操作 xff0c 而不是去背诵枯燥的概念 命令 通过前面的学习 xff0c 估计大家都已经将centos 8 5安装到自己的虚拟机里了 xff0c 可是第一次登录以后桌面怎么空空的呢 xff1f
  • stdbind剖析

    stl 算法库多数算法只能提供一个参数给绑定函数 xff0c 如 for each 函数 如果想打印 vector 中的每一个元素 xff0c 用 for each 实现方式代码如下 xff1a include lt iostream gt
  • 解决使用libhdfs.so连接hdfs出错问题java.lang.ClassNotFoundException: org.apache.hadoop.fs.F

    xfeff xfeff 出现java lang ClassNotFoundException org apache hadoop fs FileSystem错误的原因 xff1a libhdfs so并没有直接与hadoop与hdfs直接交
  • svn主干删除build.sh重新提交报错“处于冲突状态;请在新增之前标记冲突为已经解决”

    在调试编译脚本过程中 xff0c 由于一开始忘记修改脚本权限 xff0c build sh无法执行 在为build sh增加执行权限后 xff0c 准备重新提交build sh 因此通过windows的svn工具 xff08 有界面 xff
  • Kafka集群配置使用主机名,windows无法访问

    因工作需要 xff0c 在Linux集群下搭建了zookeeper集群和kafka集群 zookeeper集群和kafka集群中的所有配置均使用的真实ip地址 但由于服务节点使用的是动态IP xff0c IP地址经常发生变化 xff0c 每
  • makefile入门

    Makefile入门 1 gcc常用编译命令 gcc最简单的编译命令就是gcc c xff0c 编译当前目录下的所有源文件 现在 xff0c 假设目录say下面存在三个文件say h xff08 定义模块函数 xff09 xff0c say
  • ubuntu16.04禁止后重新开启图形界面自启动

    由于显卡内存较小 xff0c 想释放一部分显卡内存 xff0c 故使用systemctl disable lightdm关闭了图形界面自启动 但却发现调用systemctl enable lightdm xff0c 无法开启图形界面自启动
  • stl容器循环删除元素总结

    程序中有一段代码是关于stl循环删除的内容 xff0c 大体逻辑如下 xff08 实际逻辑要复杂的多 xff0c 不适合用std remove系列函数 xff09 xff1a int main int argc char argv std
  • opencv加载内存中图片

    opencv从磁盘加载一张图片非常简单 xff0c 通过cv imread即可 xff0c 代码如下 xff1a cv Mat src mat 61 cv imread 34 1 jpg 34 读取图片1 jpg xff0c imread会
  • github回退历史版本

    在使用github时 xff0c 通过git pull可以获取到最新的版本 xff0c 但这有可能不是自己想要的版本 如何回退到某个历史版本 xff1f 首先需要通过git reflog查看历史变更记录 xff0c 如下 xff1a 如上所
  • 字节对齐算法:

    字节对齐算法 字节对齐是在分配内存时需要考虑的问题 xff0c 两个小算法 xff1a 1 最容易想到的算法 span class token keyword unsigned span span class token keyword i
  • 第2章 操作系统IP设置一文整明白

    什么是IP地址 xff1f IP是 xff08 Internet Protocol Address xff09 的简写 xff0c 每台联接互联网的电脑必须有一个唯一独立的IP地址才行 xff0c 它就像你们家的门牌号 怎么查看设置IP地址
  • E2上GBA模拟器移植的困难。。。

    终于决心动手写GBA的模拟器了 修改了半晌 xff0c 终于吧Oop的模拟器源码编译通过 xff0c 但是到了机器上却跑不起来 xff0c 那个源码用了一个非常奇怪的方式来处理系统响应 xff1a 主动调用系统去处理 xff0c 没开线程
  • Android RedioButton、RadioGroup底部添加动画位移横线下划线

    最近公司做项目用到一个RadioGrop底部添加下划线的需求 xff0c 索性封装一个工具类得了 xff0c 给能用的上的码农及懒得算的童鞋节约一点时间 xff0c 如果感觉能用麻烦给点个赞不枉我辛苦一场 不说了直接贴代码 xff0c 代码