SeekBar究极进化效果—让滑块和渐变色进度条同步变色

SeekBar 垂直,进度点与thumb指示同步对齐 最近做项目,要用到垂直SeekBar,在网上找了一把,发现觉得的办法都是那么几个,弄下来实际测试了下,发现,是垂直了,可以拖动,但是,进度值与thumb只是图片无法同步对齐,要么有断层,要么超出了,要么触点偏移。所以针对网上一种找不到的,细调了下参数,完美实现了对齐,同时对调整中,对这个控件的一些逻辑了解,做个记录。 第一张图片,进度背景比较暗,不明显。 先上完整代码 package 阅读详情

先看效果

                                

静态细节:

滑动条是一个渐变色的,滑块会根据当前的位置动态变化,保持与所在位置的滑动条颜色一致。

使用到的技术点:

1.xml渐变色 

2.渐变色算法

3.drawable图层

4.drawable动态修改背景色

下面逐一介绍一下:

xml渐变色 

用xml的渐变色写滑动条的自定义背景:(直接上代码了)

上面那个seekbar的背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <corners android:radius="24dp" />
  <gradient
    android:endColor="@color/seekbar_right"
    android:centerColor="@color/seekbar_center"
    android:startColor="@color/seekbar_left"
    android:type="linear" />

</shape>

下面seekbar的背景:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@android:id/secondaryProgress">
    <clip>
      <shape>
        <corners android:radius="24dp" />
        <gradient
          android:centerColor="@color/seekbar_center"
          android:endColor="@color/seekbar_right"
          android:startColor="@color/seekbar_left"
          android:type="linear" />
      </shape>
    </clip>
  </item>
</layer-list>

颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="seekbar_left">#FF436CFF</color>
  <color name="seekbar_center">#FFF9DA55</color>
  <color name="seekbar_right">#FFF74343</color>
  <color name="seekbar_thumb_stroke_color">#FFF5F6FF</color>
</resources>

渐变色算法

用于获取当前位置的颜色

public class ColorPickGradient {

  private int[] mColorArr  ;
  private float[] mColorPosition  ;

  public ColorPickGradient(int[] colorArr,float[] mColorPosition ) {
    this.mColorArr = colorArr;
    this.mColorPosition = mColorPosition;

  }


  /**
   * 获取某个百分比位置的颜色
   * @param radio 取值[0,1]
   * @return
   */
  public int getColor(float radio) {
    int startColor;
    int endColor;
    if (radio >= 1) {
      return mColorArr[mColorArr.length - 1];
    }
    for (int i = 0; i < mColorPosition.length; i++) {
      if (radio <= mColorPosition[i]) {
        if (i == 0) {
          return mColorArr[0];
        }
        startColor = mColorArr[i - 1];
        endColor = mColorArr[i];
        float areaRadio = getAreaRadio(radio,mColorPosition[i-1],mColorPosition[i]);
        return getColorFrom(startColor,endColor,areaRadio);
      }
    }
    return -1;
  }

  public float getAreaRadio(float radio, float startPosition, float endPosition) {
    return (radio - startPosition) / (endPosition - startPosition);
  }

  /**
   *  取两个颜色间的渐变区间 中的某一点的颜色
   * @param startColor
   * @param endColor
   * @param radio
   * @return
   */
  public int getColorFrom(int startColor, int endColor, float radio) {
    int redStart = Color.red(startColor);
    int blueStart = Color.blue(startColor);
    int greenStart = Color.green(startColor);
    int redEnd = Color.red(endColor);
    int blueEnd = Color.blue(endColor);
    int greenEnd = Color.green(endColor);

    int red = (int) (redStart + ((redEnd - redStart) * radio + 0.5));
    int greed = (int) (greenStart + ((greenEnd - greenStart) * radio + 0.5));
    int blue = (int) (blueStart + ((blueEnd - blueStart) * radio + 0.5));
    return Color.argb(255, red, greed, blue);

  }

}

3.drawable图层

滑块的drawable,是一个图层。背景是可变的,左右两个白色小箭头是第二层,不变。

上代码:(thumb图层代码)

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

  <item android:drawable="@drawable/seekbar_thumb_ground_floor" />

  <item
    android:width="@dimen/seekbar_thumb_arrows_width"
    android:height="@dimen/seekbar_thumb_arrows_height"
    android:bottom="@dimen/seekbar_thumb_arrows_bottom"
    android:drawable="@drawable/thumb_left"
    android:left="@dimen/seekbar_thumb_arrows_left"
    android:top="@dimen/seekbar_thumb_arrows_top" />

  <item
    android:width="@dimen/seekbar_thumb_arrows_width"
    android:height="@dimen/seekbar_thumb_arrows_height"
    android:bottom="@dimen/seekbar_thumb_arrows_bottom"
    android:drawable="@drawable/thumb_right"
    android:gravity="right"
    android:right="@dimen/seekbar_thumb_arrows_right"
    android:top="@dimen/seekbar_thumb_arrows_top" />


</layer-list>

圆圈的那个背景

左右那两个小箭头图标是我自己截的图,如果实际使用的话可以让美工给切图

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

  <!--背景色动态修改,默认值设置为seekbar的最左侧的颜色 -->
  <solid android:color="@color/seekbar_left" />

  <stroke
    android:width="@dimen/seekbar_thumb_stroke_width"
    android:color="@color/seekbar_thumb_stroke_color" />

  <size
    android:width="@dimen/seekbar_thumb_width"
    android:height="@dimen/seekbar_thumb_height" />

</shape>

4.drawable动态修改背景色

先看代码:

public class GradientSeekBar extends androidx.appcompat.widget.AppCompatSeekBar {

  private ColorPickGradient mColorPickGradient;

  public GradientSeekBar(Context context) {
    super(context);
    init();
  }

  public GradientSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  public GradientSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }

  private void init() {

    this.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        if (mColorPickGradient != null) {
          float radio = (float) progress / seekBar.getMax();
          int mColor = mColorPickGradient.getColor(radio);
          LayerDrawable layerDrawable = (LayerDrawable) seekBar.getThumb();
          GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.getDrawable(0);
          gradientDrawable.setColor(mColor);
        }

      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {

      }
    });

  }

  public void setColorPickGradient(
      ColorPickGradient mColorPickGradient) {
    this.mColorPickGradient = mColorPickGradient;
  }


}

LayerDrawable layerDrawable = (LayerDrawable) seekBar.getThumb();
获取到图层drawable;
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.getDrawable(0);
取出图层第一个drawable;

给该drawable设置新的颜色(取色器取出来的)
gradientDrawable.setColor(mColor);

项目地址:mace-android/GradientSeekBar · GitHub

完事~

Android背景渐变色实现及源代码 本文介绍了两种常见的方法来实现Android应用程序中的背景渐变色效果:XML布局和编程实现。通过使用这些方法,我们可以轻松地为应用程序的背景添加各种吸引人的渐变色效果。首先,在我们的Activity类中,我们需要获取根视图的引用,并使用代码创建一个渐变色Drawable对象。方法,将创建的渐变色Drawable对象设置为根视图的背景。属性,我们可以指定渐变色的方向。实现背景渐变色效果的方法有多种,我们将重点介绍两种常见的方式:XML布局和编程实现。数组中的颜色值,我们可以定义渐变色的起始和结束颜色。 阅读详情

相关推荐

线性seekBar颜色获取渐变某点的颜色

转载自http://blog.youkuaiyun.com/u010593680/article/details/50987671,最近要搞颜色选择,找到方法因为没有demo随便弄一下,方便大家学习

Android控件篇 seekbar - 设置进度条颜色及渐变色

一、效果图 二、xml布局控件属性 <SeekBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:maxHeight="3.4dp" android:mi

圈池 4490

单细胞数据分析实战:用scDblFinder快速搞定异质性双细胞检测(附完整R代码)

本文详细介绍了如何使用scDblFinder工具在单细胞RNA测序数据中精准识别异质性双细胞。通过完整的R代码示例,从环境准备、数据加载到核心分析流程和结果可视化,帮助研究人员高效解决双细胞检测问题,提升单细胞数据分析的准确性。scDblFinder的集成算法和鲁棒性设计使其成为处理单细胞数据中技术噪音的理想选择。

weixin_29098117的博客 426

Android组件08—拖动条SeekBar和RatingBar

SeekBar功能及用法 SeekBar拖动条和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块的位置来标识数值—而且拖动条允许用户拖动滑块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如调节音量等。 SeekBar允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性来制定。 1、Android:thumb:指定一个Draw

bobo8945510的博客 1251

保姆级教程:在RK3576上配置USB网卡从零到外网访问(附udev规则详解)

本文提供了在RK3576开发板上配置USB网卡的完整教程,涵盖从内核驱动、udev规则到网络路由的全流程。重点讲解了如何利用USB Gadget功能实现高速网络连接,并构建稳定的算力集群,确保多设备间通信及外网访问。

grass的博客 460

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

xml 中画圆角矩形、虚线、实线 、渐变色框

Android xml 中定义矩形 虚线框 渐变色框

江锋的博客 3125

【2026年华为秋招(AI)-2月4日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要:本文包含20道选择题,涵盖机器学习、线性代数、Transformer架构、概率统计等多个领域。题目涉及正交矩阵性质、Transformer注意力机制、聚类距离度量、ReAct框架、Softmax函数、混淆矩阵计算、Flash-Attention优化、位置编码、期望计算、归一化方法、矩阵迭代法、矩阵秩、大模型架构、神经网络推理、泊松流性质、SVM核函数以及聚类算法等知识点。每道题均提供解析,帮助理解核心概念和解题思路。

m0_73659489的博客 125

android 背景线性渐变,android-如何从线性渐变获取当前颜色?

pskink’s suggestion是正确的.您可以使用ArgbEvaluator实现此目标.假设这是您的SeekBar:C1 C2 C3+-------|-------|-------|-------|---+---|-------|-------|-------...

weixin_33931886的博客 222

Oracle 查看 rman 备份情况 SQL 语句

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3119

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息

本文记录的是基于MobileNet V4的YOLOv11目标检测轻量化改进方法研究。其中MobileViT块旨在以较少的参数对输入张量中的进行建模,结合卷积与 Transformer 的优势,并实现有效的信息编码与融合本文配置了原论文中和三种模型,以满足不同的需求。

Limiiiing的博客 1074

android实现自定义seekbar,重新绘制background、secondaryProgress、progress进度条、滑块thumb

原生的seekbar,设置progressDrawable可以改变seekbar进度条的样式,例如如下样式。 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:i...

huidawoxiaozi的博客 7000

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452

android文本拖动,Android笔记之文本随滑块移动的SeekBar

packagecom.bu_ish.blog;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.os.Build;importandroid.util.AttributeSet;impo...

weixin_27303545的博客 394

torch_npu 用法笔记

torch_npu 用法笔记

jacke121的专栏 1536

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

自定义SeekBar,实现带刻度的进度条实现颜色渐变效果

自定义SeekBar, 进度变化由可视化气泡样式呈现,定制化程度较高 实现带刻度的进度条实现颜色渐变效果 源码下载:Github ,码云 Github太慢,所以只在码云上持续更新 整体效果如下: 基于woxingxiao的BubbleSeekBar修改 主要代码 1.attr中新增属性: &lt;!--渐变色号,用_分割--&gt; &lt;attr name="bsb_colors" f...

Kosmos 8771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

水平进度条:解决系统SeekBar宽度不准确、滑动颜色显示不准的问题

上篇文章:水平进度条:自定义SeekBar背景 发现, 系统自带的SeekBar,设置android:layout_width="120dp",实际宽度并不是120dp, 存在padding, 也有人说设置findViewById(R.id.seekbar).setPadding(0,0,0,0); 可以解决。实测发现,这中设置只在简单界面上起作用。在复杂布局界面仍然无效。 只能用两个第三方库,看效果图: RangeSeekBar , maven { url 'https://jitpa..

知道这个有什么用? 1565

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设置SeekBar 滑动进度 样式

布局 <SeekBar android:id="@+id/sb_uploadProgress" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxHei

时代新人的博客 724

安卓学习笔记—渐变色背景

在任何可以设置背景的控件属性里添加:android:background="@drawable/gradual_color_bg"里面各个标签的作用都解释的很清楚。

qq_14826519的博客 4698

Seekbar和ProgressBar进度条样式

seerkbar,progressbar 圆角背景,圆角进度条

tianhongfan10106的专栏 558

Android:xml实现渐变

drawble文件夹下面新建,xxx.xml内容如下 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:angle="200" android:centerColor="#EBF.

谢桥的博客 1559

android xml 渐变

设置背景色可以通过在res/drawable里定义一个xml,如下:                         android:startColor="#FFF"                 android:endColor="#000"                 android:angle="45"         /> 复制代码

821

SeekBar 设置进度条颜色

SeekBar 设置两种颜色,thumb 左右两边的 track 设置不同的颜色,实现视频、音乐播放器的 SeekBar。

Austin的博客 3217

Android seekbar progressDrawable局部渐变解决方案

看了标题可能大家有些不理解,简单一点就是seekbar拖动到哪里就哪个区域渐变,我以前的做法直接是这样的,之前代码: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape>

农村打工仔的博客 1145

【安卓】4.修改SeekBar样式进度条样式(保姆级图文+附示例)

【安卓】修改SeekBar样式进度条样式(保姆级图文+附示例)

MZH 2240

关于SeekBar的简单介绍

本篇博客主要讲解如何简单使用SeekBar(只是抛砖引玉,有什么错误的地方还请大神指出来)

朱玉强的博客 1万+
上一篇: 监听recyclerview的子View 展示 并对list展示深度进行上报
下一篇: gerrit的merge conflict
mace_android
博客等级 码龄11年 5粉丝 12原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值