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

安卓垂直进度条

package  你的包名;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class VerticalSeekBar extends View {private Paint paint;private float progressHeight;private float progress = 0;private float maxProgress = 100;private int trackColor = Color.WHITE;  // 背景颜色private int progressColor = Color.parseColor("#FF0365FF"); // 进度条颜色private float cornerRadius = 20; // 圆角半径private OnProgressChangedListener progressChangedListener; // 回调接口public VerticalSeekBar(Context context) {this(context, null);}public VerticalSeekBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);float width = getWidth();float height = getHeight();// 画背景条:圆角矩形paint.setColor(trackColor);RectF backgroundRect = new RectF(0, 0, width, height);canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, paint);// 画进度条:圆角矩形paint.setColor(progressColor);float progressTop = height - progressHeight;RectF progressRect = new RectF(0, progressTop, width, height);canvas.drawRoundRect(progressRect, cornerRadius, cornerRadius, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:// 计算进度float height = getHeight();progressHeight = height - y;if (progressHeight < 0) progressHeight = 0;if (progressHeight > height) progressHeight = height;progress = (maxProgress * progressHeight) / height;invalidate(); // 重绘视图// 调用回调方法,传递进度变化if (progressChangedListener != null) {progressChangedListener.onProgressChanged(progress);}return true;}return super.onTouchEvent(event);}// 获取当前的进度public float getProgress() {return progress;}// 设置进度public void setProgress(float progress) {this.progress = progress;invalidate();}// 设置最大进度public void setMaxProgress(float maxProgress) {this.maxProgress = maxProgress;}// 设置颜色public void setTrackColor(int color) {this.trackColor = color;}public void setProgressColor(int color) {this.progressColor = color;}// 设置圆角半径public void setCornerRadius(float radius) {this.cornerRadius = radius;}// 设置回调接口public void setOnProgressChangedListener(OnProgressChangedListener listener) {this.progressChangedListener = listener;}// 定义回调接口public interface OnProgressChangedListener {void onProgressChanged(float progress);}
}

在activity中:

<路径.VerticalSeekBarandroid:id="@+id/seekBar"android:layout_width="match_parent"android:layout_height="match_parent"/>

在代码中

    binding.seekBar.apply {setMaxProgress(100f)progress = 50fsetOnProgressChangedListener {}}

http://www.xdnf.cn/news/66385.html

相关文章:

  • 学习深度学习是否要先学习机器学习?工程师的路径选择策略
  • 部署Kimi-VL-A3B-Instruct视频推理
  • AgentGPT开源程序可以在浏览器中组装、配置和部署自主人工智能代理
  • FramePack:让视频生成更高效、更实用
  • 从0到1学习X-File-Storage:一站式文件存储解决方案
  • spark基础介绍
  • C++中函数的实现写在头文件内
  • Linux系统的介绍及操作系统的基本概念
  • 赛灵思Xilinx FPGa XCKU15P‑2FFVA1156I AMD Kintex UltraScale+
  • Qt6文档阅读笔记-RESTful API Server解析
  • 从C语言变量看内存
  • BR_调制特性(RF/TRM/CA/BV-07-C [Modulation Characteristics])
  • [密码学基础]GB与GM国密标准深度解析:定位、差异与协同发展
  • 【C++】基于红黑树的map和set封装实现
  • 美信监控易:易用性卓越的智能运维管理平台
  • 详解机器学习各算法的优缺点!!
  • 算法——背包问题(分类)
  • DeepSeek与WPS的动态数据可视化图表构建
  • 2025 活体识别+人脸认证工具类【阿里云api,需要先申请试用】
  • NetApp ONTAP 9 故障磁盘更换操作指南
  • MySQL的窗口函数(Window Functions)
  • 实训Day-1 漏洞攻击实战
  • 【LeetCode 热题 100】哈希、双指针、滑动窗口
  • 【Markdown】【HTML】在Markdown中实现康奈尔笔记模式(右侧留白)
  • 算法分析与设计——动态规划复习题(待更新
  • Flutter 状态管理 Riverpod
  • 华为IPD流程变革如何推动组织转型?2025变革路径
  • 从代码实现理解Vision Permutator:WeightedPermuteMLP模型解析
  • Java并发编程-线程池
  • spark–sql项目实验