当前位置: 首页 > news >正文

一个滑块可变色的Seekbar

因项目需要,做一个如下图的滑动条,要求如下:

1、滑块跟着进度条改变颜色

2、滑块有白色边和内部颜色组成

大体思路,就是背景需要UI按照需求提供,然后变色时,根据滑动回调动态设置对应的颜色。

直接上代码

xml里面的布局

                <SeekBar
                    android:id="@+id/atmosphere_lamp_progress_color_seekbar"
                    style="@style/atmosphere_lamp_progress_color_horizontal"
                    android:layout_width="@dimen/dimen578dp"
                    android:layout_height="@dimen/dimen32dp"
                    android:layout_marginStart="@dimen/dimen4dp"
                    android:layout_marginTop="@dimen/dimen98dp"
                    android:background="@null"
                    android:max="63"
                    android:paddingVertical="@dimen/dimen7dp"
                    android:paddingStart="@dimen/dimen16dp"
                    android:paddingEnd="@dimen/dimen16dp"
                    android:splitTrack="false" />

使用到的style

    <style name="atmosphere_lamp_progress_color_horizontal">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:thumb">@drawable/atmosphere_thumb_bg</item>
        <item name="android:progressDrawable">@drawable/bg_color_palette</item><!-- 滑动条颜色-->
        <item name="android:indeterminateDrawable">
            @android:drawable/progress_indeterminate_horizontal
        </item>
        <item name="android:minHeight">@dimen/dimen44dp</item>
        <item name="android:maxHeight">@dimen/dimen44dp</item>
    </style>

如果想让进度条有背景和进度两个滑动条,可以给progressDrawable添加一个layer-list即可

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

    <item android:id="@android:id/background" android:drawable="@drawable/slider_ambient_lighting_n_white" />

    <item android:id="@android:id/progress" android:drawable="@drawable/slider_ambient_lighting_f_white" />

</layer-list>

滑块分层我是使用了atmosphere_thumb_bg用到了layer-list

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

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

    <item
        android:width="@dimen/dimen28dp"
        android:height="@dimen/dimen28dp"
        android:top="@dimen/dimen2dp"
        android:left="@dimen/dimen2dp"
        android:drawable="@drawable/seekbar_thumb_in"/>

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

    <!--设置大小-->
    <size android:width="@dimen/dimen32dp"
        android:height="@dimen/dimen32dp"/>

    <!--设置圆角-->
    <corners android:radius="@dimen/dimen18dp"/>

    <!--设置背景颜色-->
    <solid android:color="@color/white"/>

<!--    &lt;!&ndash;设置边框&ndash;&gt;-->
<!--    <stroke android:width="2dp" android:color="@color/colorAccent"/>-->

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

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

    <item
        android:width="@dimen/dimen28dp"
        android:height="@dimen/dimen28dp"
        android:top="@dimen/dimen2dp"
        android:left="@dimen/dimen2dp"
        android:drawable="@drawable/seekbar_thumb_in"/>

</layer-list>

以上都是布局,要想动态显示还是有如下java代码:

给seekbar注册监听

    //SeekBar回调
    private SeekBar.OnSeekBarChangeListener seekChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) {
                switch (seekBar.getId()) {
                    case R.id.atmosphere_lamp_progress_color_seekbar://氛围灯颜色
                        LogUtils.d(TAG, "无极调色 == " + progress);
                        setThumbColor(seekBar, progress + 1, 255);
                        break;
                    default:
                        break;

                }
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            switch (seekBar.getId()) {
                case R.id.atmosphere_lamp_progress_color_seekbar:
                    LogUtils.i(TAG, "氛围灯———颜色 抬手 == " + lampBrightnessValue);
                    break;
                default:
                    break;
            }
        }
    };

封装的setThumbColor设置动态颜色

    //设置无极变色滑块颜色
    private void setThumbColor(SeekBar seekBar, int value, int alphaValue) {
        LayerDrawable layerDrawable = (LayerDrawable) seekBar.getThumb();
        GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.getDrawable(1);
        GradientDrawable gradientDrawable0 = (GradientDrawable) layerDrawable.getDrawable(0);
        gradientDrawable.setColor(Myapplication.getApplication().getResources().getColor(atmosphereLampHelp.valueToColor(value), null));
        gradientDrawable.setAlpha(alphaValue);
        gradientDrawable0.setAlpha(alphaValue);
    }

里面的颜色值,可以按照自己要求一一对应即可。

相关文章:

  • 计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)
  • LlamaFactory-webui:训练大语言模型的入门级教程
  • 11特殊函数
  • java——执行linux/cmd命令
  • SE注意力机制详解:从原理到应用,全面解析Squeeze-and-Excitation模块
  • JWT+redis实现三大令牌管理方案深度解析
  • DeepSeek 2月27日技术突破:三大核心功能解析与行业影响
  • AI问答-供应链管理:排队模型M/D/5/100/m/FCFS代表的含义是什么
  • ProfiNet转EtherCAT 网关:助力工业设备 “对话”的神奇纽带
  • 一文5分钟掌握基于JWT的模拟登录爬取实战
  • STR初识
  • IP、网关、子网掩码、DNS 之间的关系详解
  • 升级TTSDK抖音小游戏banner广告接入
  • ios swift摄像头画中画技术的探索与突破
  • Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名
  • 8.Dashboard的导入导出
  • VSCode轻松调试运行.Net 8.0 Web API项目
  • 如何使用豆包AI来快速提升编程能力?
  • 自然语言处理:稀疏向量表示
  • ASP.NET MVC AJAX 文件上传
  • 首届巴塞尔艺术奖公布:大卫·哈蒙斯、曹斐等36人获奖
  • 受贿2.61亿余元,陕西省政协原主席韩勇一审被判死缓
  • 国家主席习近平任免驻外大使
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突
  • 知名中医讲师邵学军逝世,终年51岁
  • 全国多家健身房女性月卡延长,补足因月经期耽误的健身时间