当前位置: 首页 > 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.dtcms.com/a/146489.html

相关文章:

  • 青少年编程与数学 02-018 C++数据结构与算法 01课题、算法
  • Android RK356X TVSettings USB调试开关
  • 深入了解 WebGIS 系统:构建地理空间信息的网络桥梁
  • “具身智能”爆火 它会带来什么改变?
  • Cursor 配置中文界面并设置浅色背景的方法
  • 语音合成(TTS)从零搭建一个完整的TTS系统-第二节-文本归一化
  • 《Android 应用开发基础教程》——第五章:RecyclerView 列表视图与适配器机制
  • esp32c3 c2如何进入下载模式
  • MCU开发学习记录10 - 高级定时器学习与实践(HAL库)—PWM互补输出、死区控制、刹车控制 - STM32CubeMX
  • Linux Wlan-四次握手(eapol)框架流程
  • CSS预处理工具有哪些?分享主流产品
  • 第二章 Logback的架构(一)
  • eBay自动化定价陷阱调查:价格战背后的利润黑洞与破局之道
  • Oracle expdp的 EXCLUDE 参数详解
  • 如何在LangChain中构建并使用自定义向量数据库
  • 操作指南:在vue-fastapi-admin上增加新的功能模块
  • Qwen-Chat与谷歌Veo2在免费AI视频方面对比
  • Unity3D ILRuntime与Scripting Backend整合指南
  • C++学习之游戏服务器开发十一DOCKER的基本使用
  • 从service 到 JobIntentService 和 WorkManager
  • 香港电讯荣膺“卓越互联网接入服务提供商”奖项,赋能中国汽车产业数字化转型
  • Linux环境准备(安装VirtualBox和Ubuntu,安装MySQL,MySQL启动、重启和停止)
  • KUKA机器人不同的安装方式的设置
  • LeetCode面试经典 150 题(Java题解)
  • C++ vector 核心功能解析与实现
  • TOGAF 敏捷冲刺:15 天 Scrum 冲刺实践
  • 新能源汽车零部件功率级测试方案搭建研究
  • STM32F103_HAL库+寄存器学习笔记19 - CAN发送中断+CAN接收中断+接收所有CAN报文+ringbuffer数据结构
  • 1.Vue3 - 创建Vue3工程
  • LeetCode 热题100题解(Java版本)