Android开发自定义双向SeekBar拖动条控件

下面就给大家详细讲解一下“Android开发自定义双向SeekBar拖动条控件的完整攻略”。

1. 开发自定义双向SeekBar的前期准备

在开始开发自定义双向SeekBar之前,我们需要先进行一些前期准备工作:

  1. 创建一个新的Android项目;
  2. 在项目的build.gradle文件中添加如下依赖:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'

  1. res/values/attrs.xml文件中添加自定义属性:

<attr name="left_progress" format="integer"/>
<attr name="right_progress" format="integer"/>
<attr name="max" format="integer"/>
<attr name="progress_color" format="color"/>

2. 开发自定义双向SeekBar的布局文件

接着,我们可以开始开发自定义双向SeekBar的布局文件。在res/layout目录下创建一个custom_seek_bar.xml文件,并添加如下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/left_progress_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:textSize="16sp"/>

    <SeekBar
        android:id="@+id/seek_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="@integer/max_seek_bar"
        android:progressDrawable="@drawable/custom_seek_bar_background"
        android:thumb="@drawable/custom_seek_bar_thumb"/>

    <TextView
        android:id="@+id/right_progress_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:textSize="16sp"/>

</LinearLayout>

接着,我们需要分别开发自定义的SeekBar背景和thumb资源文件。

3. 开发自定义背景资源文件

res/drawable目录下创建一个custom_seek_bar_background.xml文件,并添加如下代码:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />
            <corners android:radius="8dp" />
            <stroke
                android:width="1dp"
                android:color="@color/black"/>
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">    
                <size android:height="4dp" />
                <solid android:color="@color/custom_seek_bar_color" />
                <corners android:radius="8dp" />
            </shape>
        </clip>
    </item>

</layer-list>

4. 开发自定义thumb资源文件

res/drawable目录下创建一个custom_seek_bar_thumb.xml文件,并添加如下代码:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <size android:width="24dp" android:height="24dp" />

    <solid android:color="@color/custom_seek_bar_color" />

</shape>

5. 开发自定义SeekBar控件

最后,我们需要新建一个名为CustomSeekBar的Java类,该类继承自LinearLayout

public class CustomSeekBar extends LinearLayout {

    private SeekBar seekBar;
    private TextView leftProgressText;
    private TextView rightProgressText;

    private int max;
    private int leftProgress;
    private int rightProgress;
    private int progressColor;

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

    private void init(Context context, AttributeSet attrs) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.custom_seek_bar, this, true);

        seekBar = findViewById(R.id.seek_bar);
        leftProgressText = findViewById(R.id.left_progress_text);
        rightProgressText = findViewById(R.id.right_progress_text);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomSeekBar);
        max = a.getInt(R.styleable.CustomSeekBar_max, 100);
        leftProgress = a.getInt(R.styleable.CustomSeekBar_left_progress, 0);
        rightProgress = a.getInt(R.styleable.CustomSeekBar_right_progress, max);
        progressColor = a.getColor(R.styleable.CustomSeekBar_progress_color, ContextCompat.getColor(context, R.color.custom_seek_bar_color));
        a.recycle();

        seekBar.setMax(max);
        seekBar.setProgressDrawable(ContextCompat.getDrawable(context, R.drawable.custom_seek_bar_background));
        seekBar.setThumb(ContextCompat.getDrawable(context, R.drawable.custom_seek_bar_thumb));

        updateProgress(leftProgress, rightProgress);

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser) {
                    if (progress <= leftProgress) {
                        updateProgress(progress, rightProgress);
                    } else {
                        updateProgress(leftProgress, progress);
                    }
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    private void updateProgress(int leftProgress, int rightProgress) {
        this.leftProgress = leftProgress;
        this.rightProgress = rightProgress;

        seekBar.setProgressDrawable(getSeekBarDrawable());

        leftProgressText.setText(String.valueOf(leftProgress));
        rightProgressText.setText(String.valueOf(rightProgress));
    }

    private Drawable getSeekBarDrawable() {
        Bitmap bitmap = Bitmap.createBitmap(seekBar.getWidth(), seekBar.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        // draw left progress
        Paint leftPaint = new Paint();
        leftPaint.setColor(progressColor);
        RectF leftRect = new RectF(0, 0, getProgressWidth(leftProgress), seekBar.getHeight());
        canvas.drawRect(leftRect, leftPaint);

        // draw right progress
        Paint rightPaint = new Paint();
        rightPaint.setColor(progressColor);
        RectF rightRect = new RectF(getProgressWidth(leftProgress), 0, seekBar.getWidth(), seekBar.getHeight());
        canvas.drawRect(rightRect, rightPaint);

        // draw thumb
        Drawable thumbDrawable = seekBar.getThumb();
        int thumbX = (int) (getProgressWidth(leftProgress) - (thumbDrawable.getIntrinsicWidth() / 2.0f));
        int thumbY = seekBar.getHeight() / 2 - thumbDrawable.getIntrinsicHeight() / 2;

        canvas.translate(thumbX, thumbY);
        thumbDrawable.draw(canvas);

        return new BitmapDrawable(getResources(), bitmap);
    }

    private int getProgressWidth(int progress) {
        int progressBarWidth = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
        float ratio = (float) (progress - seekBar.getMin()) / (float) (seekBar.getMax() - seekBar.getMin());
        return (int) (ratio * progressBarWidth);
    }

    public int getLeftProgress() {
        return leftProgress;
    }

    public int getRightProgress() {
        return rightProgress;
    }

}

以上就是开发一个自定义双向SeekBar拖动条控件的完整攻略,下面给出一个使用示例。

示例

在布局文件中使用自定义SeekBar:

<com.example.customseekbar.CustomSeekBar
    android:id="@+id/custom_seek_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:left_progress="20"
    app:right_progress="80"
    app:max="100"
    app:progress_color="@color/custom_seek_bar_color"/>

在代码中获取自定义SeekBar的左右进度值:

CustomSeekBar customSeekBar = findViewById(R.id.custom_seek_bar);
int leftProgress = customSeekBar.getLeftProgress();
int rightProgress = customSeekBar.getRightProgress();

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android开发自定义双向SeekBar拖动条控件 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 鼠标右键显示控制面板按钮设置方法

    下面是关于“鼠标右键显示控制面板按钮设置方法”的详细攻略。 1. 在桌面上创建快捷方式 在桌面上创建控制面板快捷方式的方法: 首先,鼠标右键单击桌面空白处,在弹出的快捷菜单中选择“新建 > 快捷方式”; 在新建快捷方式窗口中,输入以下命令:explorer.exe shell:::{21EC2020-3AEA-1069-A2DD-08002B30309…

    other 2023年6月27日
    00
  • centos7下安装pip

    当然,我可以为您提供有关“CentOS 7下安装pip”的完整攻略,以下是详细说明: CentOS 7下安装pip pip是Python的包管理工具,可以用于安装、升级和卸载Python包。在CentOS 7上安装pip需要执行以下步骤: 步骤1:安装epel-release 在CentOS 7上安装pip需要先安装epel-release,可以使用以下命安…

    other 2023年5月7日
    00
  • 腾讯QQ2004II Beta3火爆下载 可自定义头像

    腾讯QQ2004II Beta3火爆下载攻略 什么是腾讯QQ2004II Beta3? 腾讯QQ2004II Beta3是腾讯公司早期推出的一款即时通讯软件。它支持自定义头像等功能,同时也具备消息发送、语音聊天等常见的IM功能。 如何下载腾讯QQ2004II Beta3? 步骤一:打开腾讯QQ官网 访问腾讯官网,进入QQ下载页面。 步骤二:选择版本 在下载页…

    other 2023年6月25日
    00
  • 微信开发者工具怎么关闭代码缩略图?微信开发者工具关闭代码缩略图教程

    微信开发者工具关闭代码缩略图攻略 微信开发者工具是开发微信小程序的重要工具之一。代码缩略图是开发者工具中的一个功能,用于在代码编辑器中显示代码的缩略图。有时候,开发者可能希望关闭代码缩略图以获得更大的编辑器空间或提高编辑器性能。下面是关闭代码缩略图的完整攻略。 步骤一:打开微信开发者工具 首先,打开微信开发者工具。你可以在电脑上的应用程序列表或启动器中找到它…

    other 2023年7月27日
    00
  • android什么意思?

    Android是一种基于Linux的开放源代码操作系统,主要针对移动设备开发。它采用Java编程语言和面向对象的方式进行开发,在移动设备上提供了丰富的应用程序和服务支持。 Android的架构可以分为四层:应用层,应用框架层,系统运行库层和Linux内核层。应用层提供用户界面,包括各种应用程序,如电话、短信、浏览器等等。应用框架层提供了开发应用所需要的API…

    其他 2023年4月16日
    00
  • C++中模板和STL介绍详解

    C++中模板和STL介绍详解 一、模板 1.1 模板的概念 模板是C++中的一种特殊的机制,可以帮助我们实现通用的重复使用的代码。相当于对代码进行了泛化处理,将一些具体类型变成参数供调用的时候注入不同的类型,大大提高了代码的复用性。 1.2 模板的语法 模板有两种类型:函数模板和类模板。函数模板定义的函数可以用于不同类型的参数,类模板定义的类也可以用于不同数…

    other 2023年6月27日
    00
  • 鼠标右键菜单在鼠标左侧出现的解决方法

    鼠标右键菜单在鼠标左侧出现的问题是因为系统的设置或者软件的设计存在问题,需要进行相应的调整和修复。 以下是详细的解决方法: 方法一:通过注册表进行设置 打开注册表编辑器,方法是:按下Win+R,输入“regedit”,回车。 导航到HKEY_CURRENT_USER\Control Panel\Desktop目录。 找到名为“UserPreferencesM…

    other 2023年6月27日
    00
  • Spring Cloud微服务(一):公共模块的搭建

    下面是“Spring Cloud微服务(一):公共模块的搭建的完整攻略”的详细讲解,包括基本原理、实现方法和两个示例说明。 基本原理 在微服务架构中,公共模块是多个微服务共享的模块,包括工具类、配置文件、数据库访问等。公共模块的搭建可以提高代码的复用性和可维护性,减少重复开发和维护成本。 实现方法 实现公共模块的搭建的方法如下: 创建一个Maven项目,作为…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部