自定义控件之绘图篇(三)区域(Range)

news2024/10/6 2:05:00

在Android开发中,自定义控件经常需要处理各种类型的绘图需求,包括但不限于按钮、滑块、进度条等。对于涉及范围(Range)概念的控件,比如滑动选择器、时间线指示器或是数值范围选择器,实现起来需要对CanvasPaint有深入的理解。接下来,我将向你展示如何在自定义控件中实现一个范围指示器,它可以显示一个或多个可选的范围值。

自定义Range控件

我们将创建一个自定义View,该View能够显示一个水平的范围指示器,其中包含一个或两个可拖动的手柄,用于设定范围的最小值和最大值。

创建自定义View

首先,定义一个名为RangeIndicatorView的自定义View:

Java

1public class RangeIndicatorView extends View {
2
3    private static final int DEFAULT_MIN_VALUE = 0;
4    private static final int DEFAULT_MAX_VALUE = 100;
5    private static final int DEFAULT_SELECTED_MIN_VALUE = 20;
6    private static final int DEFAULT_SELECTED_MAX_VALUE = 80;
7    private static final int TRACK_HEIGHT = 30;
8    private static final int THUMB_RADIUS = 15;
9
10    private Paint trackPaint;
11    private Paint thumbPaint;
12    private RectF trackRect;
13    private float minValue, maxValue;
14    private float selectedMinValue, selectedMaxValue;
15    private float thumbLeftPos, thumbRightPos;
16
17    public RangeIndicatorView(Context context) {
18        this(context, null);
19    }
20
21    public RangeIndicatorView(Context context, @Nullable AttributeSet attrs) {
22        this(context, attrs, 0);
23    }
24
25    public RangeIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
26        super(context, attrs, defStyleAttr);
27        init();
28    }
29
30    private void init() {
31        // 初始化画笔
32        trackPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
33        trackPaint.setColor(Color.GRAY);
34        trackPaint.setStyle(Paint.Style.FILL);
35
36        thumbPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
37        thumbPaint.setColor(Color.RED);
38        thumbPaint.setStyle(Paint.Style.FILL);
39
40        // 设置默认值
41        minValue = DEFAULT_MIN_VALUE;
42        maxValue = DEFAULT_MAX_VALUE;
43        selectedMinValue = DEFAULT_SELECTED_MIN_VALUE;
44        selectedMaxValue = DEFAULT_SELECTED_MAX_VALUE;
45
46        trackRect = new RectF();
47
48        // 更新手柄位置
49        updateThumbPositions();
50    }
51
52    @Override
53    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
54        super.onSizeChanged(w, h, oldw, oldh);
55        // 当View尺寸改变时,重新计算Track的RectF
56        calculateTrackRect();
57    }
58
59    @Override
60    protected void onDraw(Canvas canvas) {
61        super.onDraw(canvas);
62        // 绘制Track
63        canvas.drawRect(trackRect, trackPaint);
64        // 绘制左边手柄
65        canvas.drawCircle(thumbLeftPos, getHeight() / 2, THUMB_RADIUS, thumbPaint);
66        // 绘制右边手柄
67        canvas.drawCircle(thumbRightPos, getHeight() / 2, THUMB_RADIUS, thumbPaint);
68    }
69
70    private void calculateTrackRect() {
71        int width = getWidth();
72        int height = getHeight();
73        trackRect.set(0, (height - TRACK_HEIGHT) / 2, width, (height + TRACK_HEIGHT) / 2);
74    }
75
76    private void updateThumbPositions() {
77        int width = getWidth();
78        thumbLeftPos = (selectedMinValue - minValue) / (maxValue - minValue) * width;
79        thumbRightPos = (selectedMaxValue - minValue) / (maxValue - minValue) * width;
80    }
81
82    public void setRange(float min, float max) {
83        minValue = min;
84        maxValue = max;
85        updateThumbPositions();
86        invalidate();
87    }
88
89    public void setSelectedRange(float min, float max) {
90        selectedMinValue = min;
91        selectedMaxValue = max;
92        updateThumbPositions();
93        invalidate();
94    }
95}
关键点解析
  • 初始化:在构造函数中,我们创建了两个Paint对象,分别用于绘制轨道(Track)和手柄(Thumb)。我们还设置了默认的范围值和选定范围值,并初始化了RectF对象用于存储Track的边界。

  • onSizeChanged:当View的大小发生变化时,这个方法会被调用来重新计算Track的RectF

  • onDraw:这是绘制的主要逻辑,我们在这里绘制Track和两个手柄。

  • calculateTrackRect:根据当前View的宽度和高度计算Track的位置。

  • updateThumbPositions:根据选定的范围值计算手柄应该出现在哪个位置。

  • setRangesetSelectedRange:允许外部调用者设置范围和选定范围。

使用自定义View

现在,你可以在布局文件中使用这个自定义View了:

Xml

1<com.example.yourpackage.RangeIndicatorView
2    android:id="@+id/range_indicator_view"
3    android:layout_width="match_parent"
4    android:layout_height="wrap_content"/>

并且在Activity中可以通过findViewById找到它并设置范围:

Java

1RangeIndicatorView rangeIndicatorView = findViewById(R.id.range_indicator_view);
2rangeIndicatorView.setRange(0, 100); // 设置总范围
3rangeIndicatorView.setSelectedRange(20, 80); // 设置选定范围

这个自定义控件提供了一个基础框架,你可以根据具体需求进一步扩展其功能,例如添加触摸事件处理来实现手柄的拖拽操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis基本命令源码解析-字符串命令

1. set 用于将kv设置到数据库中 2. mset 批量设置kv mset (msetnx) key1 value1 key2 value2 ... mset:msetCommand msetnx:msetnxCommand msetCommand和msetnxCommand都调用msetGenericCommand 2.1 msetGenericCommand 如果参数个数为偶数,则响应参数错误并返回 如果…

3.js - 模板渲染 - 金属切面效果

md&#xff0c;狗不学&#xff0c;我学 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.m…

[搭建个人网站] 云服务器 or 本地环境搭建

别人没有的&#xff0c;你有&#xff0c;你就牛。 面试&#xff0c;吹牛皮的时候 都可以拉出来溜溜 本文介绍2种搭建网站模式方式&#xff1a;区别嘛&#xff08;花钱跟不花钱&#xff09; 花钱&#xff1a; 1. 先购买个域名。。&#xff08;这里就不多介绍了&#xff0c;随便…

Codeforces Round 955 E. Number of k-good subarrays【分治、记忆化】

E. Number of k-good subarrays 题意 定义 b i t ( x ) bit(x) bit(x) 为 x x x 的二进制表示下 1 1 1 的数量 一个数组的子段被称为 k − g o o d k-good k−good 的当且仅当&#xff1a;对于这个子段内的每个数 x x x&#xff0c;都有 b i t ( x ) ≤ k bit(x) \leq k…

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

仿写Spring IOC

文章目录 IOC思路手写代码思路一些杂七杂八&#xff08;可跳过&#xff09; IOC思路 手写代码思路 手写代码的思路: 自定义一个MyAnnotationConfigApplicationContext&#xff0c;构造器中传入要扫描的包。获取这个包下的所有类。遍历这些类&#xff0c;找出添加了Component注…

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…

ubuntu下载Nginx

一、Nginx下载安装&#xff08;Ubuntu系统&#xff09; 1.nginx下载 sudo apt-get install nginx2.nginx启动 启动命令 sudo nginx重新编译(每次更改完nginx配置文件后运行&#xff09;&#xff1a; sudo nginx -s reload3.测试nginx是否启动成功 打开浏览器访问本机80端口…

09.QT控件:按钮类控件

1. QPushButton 在QT中使⽤ QPushButton 表⽰⼀个按钮。QPushButton 继承⾃ QAbstractButton&#xff0c;这个类是⼀个抽象类&#xff0c;是其他按钮的⽗类。 &#xff08;1&#xff09;QAbstractButton 中&#xff0c;和 QPushButton 相关性较⼤的属性&#xff1a; &#xf…

独立开发者系列(21)——HTTP协议的使用

作为网络访问的必备知识点&#xff0c;http协议&#xff0c;我们已经知道http协议属于tcp的一种&#xff0c;而且一般是用于网络通讯的&#xff0c;但是本身http协议本身包含的内容也很多&#xff0c;正是因为有这种协议&#xff0c;前后端和各种硬件接口/服务器接口/前端&…

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点2.2.四个点从0号…

缓存-缓存的使用与基本详解

1.缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而db承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; …

【数据库】MySQL基本操作语句

目录 一、SQL语句 1.1 SQL分类 1.2 SQL语言规范 1.3 数据库对象与命名 1.3.1 数据库的组件(对象)&#xff1a; 1.3.2 命名规则&#xff1a; 1.4 SQL语句分类 二、基本命令 2.1 查看帮助信息 2.2 查看支持的字符集 2.3 查看默认使用的字符集 2.4 修改默认字符集 2.5…

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…

将 KNX 接入 Home Assistant 之四 功能测试

一&#xff1a;测试标准的KNX网关功能 测试软件识别是否正常 可以看到再ETS6和ETS5上都能正常识别 测试数据收发 可以正常发送数据 测试配置设备参数&#xff08;下载配置&#xff09; 可以看出&#xff0c;在ETS5上是可以正常下载参数的 但是 ETS6下载是失败的&#xff…

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

make工具

1、什么是make&#xff1f; make是个命令&#xff0c;是个可执行程序&#xff0c;是个工具&#xff0c;用来解析Makefile文件的命令&#xff0c;这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;面对海量的图片资源&#xff0c;如何高效管理、快速处理&#xff0c;成为了许多人头疼的问题。今天&#xff0c;我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

【全面介绍下如何使用Zoom视频会议软件!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…