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

在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.rhkb.cn/news/370316.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序&#xff0c; BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序&#xff0c; BD_SharedIOClientd.dll (32bit&#…

CV03_mAP计算以及COCO评价标准

COCO数据集回顾&#xff1a;CV02_超强数据集&#xff1a;MSCOCO数据集的简单介绍-CSDN博客 1.1 简介 在目标检测领域中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个广泛使用的性能评估指标&#xff0c;用于衡量目标检测模型…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中&#xff0c;政务大厅作为服务民众的前沿阵地&#xff0c;其服务效率和质量直接影响着政府形象和民众满意度。然而&#xff0c;许多政务大厅仍面临着缺乏智能化导航系统的挑战&#xff0c;这不仅增加了群众的办事难度&#xff0c;也降低了服务效率。维小帮…

HTML5使用<pre>标签:保留原始排版方式

在网页创作中&#xff0c;一般是通过各种标记对文字进行排版的。但是在实际应用中&#xff0c;往往需要一些特殊的排版效果&#xff0c;这样使用标记控制起来会比较麻烦。解决的方法就是保留文本格式的排版效果&#xff0c;如空格、制表符等。 如果要保留原始的文本排版效果&a…

跟《经济学人》学英文:2024年07月06日这期:Finishing schools for the age of TikTok

Finishing schools for the age of TikTok Unsure how to be polite at work? Ask a digital etiquette guru 不确定如何在工作中保持礼貌&#xff1f;请教一位数字礼仪大师 “Finishing schools” 是指专门为年轻女性提供礼仪、社交技巧、文化修养等教育的学校&#xff0c;…

智慧文旅(景区)解决方案PPT(42页)

智慧文旅解决方案摘要 行业分析中国旅游业正经历消费大众化、需求品质化、发展全域化和产业现代化的发展趋势。《“十三五”旅游业发展规划》的发布&#xff0c;以及文化和旅游部的设立&#xff0c;标志着旅游业的信息化和智能化建设成为国家战略。2018年推出的旅游行业安全防范…

【Python实战因果推断】23_倾向分3

目录 Propensity Score Matching Inverse Propensity Weighting Propensity Score Matching 另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对&#xff0c;并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景&#xff0c;您可…

linux下的网络编程

网络编程 1. 网络基础编程知识1.1网络字节序问题1.2 常用socket编程接口1.2.1 sockaddr1.2.2 ip地址转换函数1.2.4 socket()1.2.3 bind()1.2.4 listen()1.2.5 accept()1.2.6 connect() 1.3 以udp为基础的客户端连接服务器的demo1.4 以udp为基础的的服务器聊天室功能demo1.5 基于…

网安小贴士(6)TCP/IP分层

一、前言 1983年&#xff0c;美国国防部决定将TCP/IP作为所有计算机网络的标准协议&#xff0c;这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展&#xff0c;TCP/IP模型被广泛应用于各种网络环境中&#xff0c;包括局域网&#xff08;LAN&#…

Linux-DNS

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。…

优化路由,优化请求url

1、使用父子关系调整下使其更加整洁 2、比如说我修改了下url,那所有的页面都要更改 优化&#xff1a;把这个url抽出来&#xff0c;新建一个Api文件夹用于存放所有接口的url&#xff0c;在业务里只需要关注业务就可以 使用时 导包 发请求 如果想要更改路径&#xff0c;在这里…

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…

View->裁剪框View的绘制,手势处理

XML文件 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android…

Linux系统的基础知识和常用命令

1、什么是Linux&#xff1f; 是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行…

Flink实现准确和高效流处理的关键问题

时间相关: Watermark 水位线 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据。水位线主要的内容是一个时间戳,用来表示当前事件时间的进展。水位线是基于数据的时间戳生成的。水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进,进展。水位线…

Git 运用小知识

1.Git添加未完善代码的解决方法 1.1 Git只是提交未推送 把未完善的代码提交到本地仓库 只需点击撤销提交&#xff0c;提交的未完善代码会被撤回 代码显示未提交状态 1.2 Git提交并推送 把未完善的代码提交并推送到远程仓库 点击【未完善提交并推送】的结点选择还原提交&#x…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化2(优化排序、mongos优化)

优化排序 在MongoDB里面&#xff0c;如果能够利用索引来排序的话&#xff0c;直接按照索引顺序加载数据就可以了。如果不能利用索引来排序的话&#xff0c;就必须在加载了数据之后&#xff0c;再次进行排序&#xff0c;也就是进行内存排序。 可想而知&#xff0c;如果内存排序…

【Oracle】Oracle常用函数

目录 聚合函数数字函数1. ABS函数&#xff1a;返回一个数的绝对值。2. CEIL函数&#xff1a;返回大于等于给定数的最小整数。3. FLOOR函数&#xff1a;返回小于等于给定数的最大整数。4. ROUND函数&#xff1a;将一个数四舍五入到指定的小数位。5. MOD函数&#xff1a;返回两个…

Vue 数据大屏适配

1、准备俩个盒子 .dataScreen-content 盒子内容根据设计稿给的px单位进行正常的布局就行 2、盒子的CSS样式 .dataScreen-container {width: 100%;height: 100%;// 有背景图需要的样式background: url("./images/bg.png") no-repeat;background-repeat: no-repeat;b…

推荐算法学习笔记2.1:基于深度学习的推荐算法-基于共线矩阵的深度推荐算法-AutoRec模型

AutoRec模型 前置知识&#xff1a;推荐算法学习笔记1.1:传统推荐算法-协同过滤算法 AutoRec模型通过引入自编码器结构&#xff0c;将共线矩阵中的用户向量&#xff08;基于用户的U-AutoRec&#xff09;或物品向量&#xff08;基于物品的I-AutoRec&#xff09;嵌入到低维空间后还…