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

yizhihongxing

下面就给大家详细讲解一下“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日

相关文章

  • updatexml函数菜鸟

    当然,我很乐意为您提供有关“updatexml函数菜鸟”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是updatexml函数? updatexml函数是MySQL中的一个XML函数,用于更新XML类型的数据。它可以在XML文档中插入、删除或替换元素或属性。 以下是updatexml函数的基本语法: updatexml(xml_document, xp…

    other 2023年5月6日
    00
  • Android手机获取root权限并实现关机重启功能的方法

    Android手机获取root权限并实现关机重启功能的方法 在Android系统中,root权限是最高权限,可以对设备进行任意修改和操作。在某些情况下,需要获取root权限才能执行一些高级的操作,例如实现关机重启等功能。下面是获取Android手机root权限并实现关机重启功能的详细攻略。 步骤一:获取root权限 确认手机型号和系统版本:在获取root权限…

    other 2023年6月27日
    00
  • yarn使用简介

    Yarn使用简介 什么是Yarn? Yarn 是一个强大的包管理工具,它可以替代你的默认包管理工具 npm,可以更高效和更可靠地安装和管理 JavaScript 依赖项。Yarn 由 Facebook、Google、Exponent 和 Tilde 等公司的工程师共同开发和维护,得到了广泛的支持和认可。 Yarn的安装 安装 Yarn 非常简单,官网提供了多…

    其他 2023年3月28日
    00
  • Centos 7.4中的远程访问控制的实现方法

    CentOS 7.4中实现远程访问控制主要通过两种途径:使用iptables防火墙和使用SELinux安全模块。下面分别进行详细介绍。 使用iptables实现远程访问控制 iptables是Linux中一种优秀的防火墙软件,既可以用于控制本地进出规则,也可以做为一个路由器使用。具体实现步骤如下: 首先检查使用的CentOS 7.4系统是否已默认开启ipta…

    other 2023年6月27日
    00
  • Android自定义View实现圆弧进度的效果

    下面将详细讲解”Android自定义View实现圆弧进度的效果”的完整攻略。 1.自定义View的基本使用 在介绍如何实现圆弧进度效果之前,先简要介绍下自定义View的基本使用。自定义View有两种实现方式:继承已有的View或ViewGroup,在自定义View中绘制样式或添加其他控件。下面以第一种方式为例: 1.1 文本绘制 下面是一个简单的示例代码,实…

    other 2023年6月20日
    00
  • 7款易上手c语言编程软件推荐

    7款易上手C语言编程软件推荐 C语言是一门广泛应用于系统编程、嵌入式系统和游戏开发的编程语言。想要学好C语言,选用适合自己的编程软件是非常重要的。本文将为大家推荐7款易上手的C语言编程软件。 1. Dev-C++ Dev-C++是一个免费的、开源的IDE集成开发环境,它支持C语言和C++,可以在Windows操作系统上运行。Dev-C++提供了基本的编辑器和…

    其他 2023年3月29日
    00
  • python-mhttp.server搭建一个简易web下载服务器

    Python-mhttp.server搭建一个简易web下载服务器 在日常开发中,我们常常需要向别人分享文件,如软件、文档等。常见的方式有通过QQ、微信等聊天工具发送,或者使用一些云盘服务(如百度网盘、腾讯微云等)上传后发送链接。但是,这些方式都需要下载对方分享的文件,显得有些麻烦。那么,如何快速地搭建一个简易web下载服务器,让别人可以通过浏览器下载我们分…

    其他 2023年3月28日
    00
  • Android程序退出完美解决方案兼容所有SDK

    下面是Android程序退出完美解决方案的详细攻略: 1. 问题描述 在开发Android应用时,经常会遇到应用退出的问题。一些开发者常常使用 System.exit(0) 来强制退出应用,但是这种方法并不推荐,因为它会终止整个Java虚拟机,可能会导致一些其他问题。而且,它也不是兼容所有的Android SDK版本。 因此,我们需要找到更好的解决方案来安全…

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