自定义View之VerticalProgress

[Unity]环形进度条(Progress)/拖拽条(Slider)制作 UGUI实现的圆形进度条 可用于进度条显示 也可用于拖拽验证码的功能 阅读详情

根据公司UI要求,需要设计一个进度条,竖直的从上往下显示进度。效果图如下:

android中自定义view,一般指这三种方式:

  • 继承自android原生的控件,如ProgressBar,ListView等;
  • 组合控件,将多个控件组合起来;
  • 完全自定义控件,继承自View。

最开始想通过自定义原生的ProgressBar或者SeekBar实现,但是大家都知道,

ProgressBar:是不跟用户交互的,只提供显示任务进度的作用。ProgressBar样式风格有大约6种,但基本上就两种:旋转进度条和水平进度条,而也只有水平进度条才可以设置进度的递增,其他的风格只是一个循环的动画。重写ProgressBar可以让它变为竖直,但我没找到让它从上往下显示进度的方法(默认从左往右变为竖直后是从下往上),就放弃这种方式了。

SeekBar:是ProgressBar的子类,有一个拖动条,可以拖动控制进度,但不太不符合公司需求就不再多琢磨了。

于是乎,进入正题,通过继承View来自定义UI实现需求。

------------------------------------------------------

1、继承view

public class VerticalProgress extends View {

    private int mRadius; //进度条圆角
    private int mEndResId; // 进度条颜色
    private int mProgressBgColorId; //进度条背景填充色
    private int mBorderWidth; //边框宽度
    private int progress = 0; // 默认进度
    private int maxProgress = 100; // 最大进度值
    private int mWidth;
    private int mHeight;
    private RectF mRectF;
    private Paint mPaint;

    public VerticalProgress(Context context) {
        super(context);
        init(context, null);
    }

    public VerticalProgress(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = getMeasuredWidth() - 1;// 宽度值
        mHeight = getMeasuredHeight() - 1;// 高度值
    }

    @SuppressLint("CustomViewStyleable")
    private void init(Context context, AttributeSet attrs) {
        TypedArray typedArray = null;
        if (attrs != null) {
            typedArray = context.obtainStyledAttributes(attrs, R.styleable.verticalProgress);
            mRadius = typedArray.getInt(R.styleable.verticalProgress_progress_radius, 0);
            mProgressBgColorId = typedArray.getResourceId(R.styleable.verticalProgress_progress_solid_color, R.color.progress_bg);
            mEndResId = typedArray.getResourceId(R.styleable.verticalProgress_progress_end_color, R.color.progress_fg);
            mBorderWidth = typedArray.getResourceId(R.styleable.verticalProgress_progress_border_width, 10);
        }
        if (typedArray != null) {
            typedArray.recycle();
        }
        mRectF = new RectF();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 两端圆角弧度,为高度的一半
        if (mRadius == 0) {
            mRadius = mWidth / 2;
        }

        // 画背景层
        mPaint.setColor(getResources().getColor(mProgressBgColorId));
        mRectF.set(mBorderWidth, mBorderWidth, mWidth - mBorderWidth, mHeight - mBorderWidth);
        canvas.drawRoundRect(mRectF, mRadius, mRadius, mPaint);

        // 画进度层
        if (progress == 0)//进度为0时,不画进度
            return;
        mPaint.setColor(getResources().getColor(mEndResId)); // 修改进度层颜色
        mRectF.set(10, 0, mWidth - 10, progress / 100f * mHeight); // 修改进度层宽度:从上往下
//        mRectF.set(+10, mHeight - progress / 100f * mHeight + 10, mWidth - 10, mHeight - 10); // 修改进度层宽度:从下往上
        canvas.drawRoundRect(mRectF, mRadius, mRadius, mPaint); //画进度层圆角矩形(盖在背景层之上)
    }

    public void setProgress(int currentCount) {
        this.progress = currentCount > maxProgress ? maxProgress : currentCount;
        postInvalidate();
    }

}

2、res/values/attrs.xml文件添加内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="verticalProgress">
        <attr name="progress_radius" format="dimension" />
        <attr name="progress_solid_color" format="color" />
        <attr name="progress_end_color" format="color" />
        <attr name="progress_border_width" format="dimension" />
    </declare-styleable>

</resources>

3、res/values/colors.xml文件添加内容:

<color name="progress_bg">#FF4B85A1</color>
<color name="progress_fg">#FFA5DBE8</color>

4、xml布局文件使用:(根布局是RelativeLayout)

<包名.VerticalProgress
    android:id="@+id/progress_bar"
    android:layout_width="18dp"
    android:layout_height="180dp"
    android:layout_alignParentEnd="true"
    android:layout_marginEnd="12dp"
    android:layout_marginTop="93dp" />

5、代码中使用:

(1)初始化:findViewById(R.id.progress_bar)
(2)调用方法改变进度:setProgress(60)

综上,实现需求!

自定义垂直进度条VerticalProgressBar及属性动画的使用 立即下载

相关推荐

VerticalProgressBar 垂直进度条

VerticalProgressBar 垂直进度条

Android绘制垂直进度条并且动态更改进度条颜色

自定义垂直进度条

weixin_46999174的博客 1305

避开STM32H7的‘保护陷阱’:从Option Byte机制深度解析读写保护原理与预防

本文深度解析STM32H723VGT6的Option Byte保护机制,详细讲解RDP读保护和WRP写保护的工作原理及配置方法,并提供硬件设计防御策略和软件预防性编程技巧,帮助开发者避免误触发保护机制导致芯片锁定的问题。

weixin_33686714的博客 441

u-view线形进度条

【代码】u-view线形进度条。

weixin_43337481的博客 889

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

脑电分析:为什么大脑信号会“变同步”?——事件相关同步化与去同步化 (ERS/ERD) 全景解析

脑电分析中的事件相关同步化(ERS)和去同步化(ERD)是研究大脑动态节律的重要方法,反映特定任务下脑电频段能量的变化。ERD表示神经元活动分散(功率下降),提示脑区活跃处理信息;ERS则反映神经元同步(功率增强),常与静息状态相关。本文详解了ERS/ERD的生理机制、计算流程(包括基线校正和功率谱分析),并提供了Python实现示例,展示如何通过Welch法和STFT进行时频分析,生成ERD/ERS热力图。该技术广泛应用于运动想象脑机接口、癫痫检测等领域,为理解大脑功能状态提供了量化工具。

qq_32516809的博客 1395

安卓自定义控件--垂直进度条

安卓只给我们提供了水平的进度条和环形进度条,没有垂直的进度条,下面我们来开发个垂直的进度条。效果图如下: 一、工作原理其实就是画一个矩形,改变矩形的高度就能模拟进度的变化。当进度变化时,改变矩形的高度,然后重绘即可。二、代码如下1.VerticalProgressBar.Java( 继承View): private Paint paint;// 画笔 private int pro

overturn的博客 969

银河麒麟v10-arm SEALOS离线部署k8s集群(v1.22.8)

示例 如果你想保存一个名为 "my_snapshot" 的 etcd 快照到指定的对象路径你可以使用以下命令: sealos etcd save --backupPath /root --name my_snapshot 如果文件名带时间戳:my_snapshot$(date +"%Y%m%d_%H%M%S") 会生成一个形如 20230913_143045 的时间戳。--restorePath string:指定快照恢复目录(默认为 "/opt/sealos/etcd-restore")。

xjudt的博客 3286

Android垂直ProgressBar的实现

1. 定义类继承ProgressBar public class VerticalProgressBar extends ProgressBar {     public VerticalProgressBar(Context context) {         super(context);     }           public VerticalProgressB

a0407240134的专栏 1220

12、知识图谱数据处理与推理全解析

本文深入解析了知识图谱中的数据处理与推理技术,涵盖SHACL的多种约束类型(如值约束、范围约束、字符串约束、逻辑约束等)及其在数据质量控制中的应用,并介绍了常用的SHACL工具与实际案例。文章对比了SPARQL与SHACL的特点,探讨了RDF(S)的局限性,引出表达能力更强的OWL和OWL2语言及其在语义网和生物医学等领域的应用。此外,还阐述了规则在知识表示中的作用,包括产生式规则和Datalog规则,并总结了知识图谱中推理的重要性与典型流程,为构建高质量、可推理的知识图谱提供了全面的技术指导。

zz67890的博客 135

QNX侧触摸屏(TP)Bringup流程与源码深度解析

QNX侧TP Bringup的核心在于构建。

QQ_778132974的博客 477

Android 垂直进度

摘要 : 开启开篇一张图,内容全靠吹的模式(ctrl+c,ctrl+v)。 垂直Progress ProgressBar 深入分析 ProgressBar 深入分析 通过上面吧垂直progress抽取出来。 修改进度条样式 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;layer-list xmlns:android="h...

guyuelin123的博客 914

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)和电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码和模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 179

超级简单实用的垂直(竖直)进度条

东西比较简单,就不说那么多,只为日常方便 代码注释特别清晰,就不多解释了 支持属性: progress_radius 进度条圆角大小 progress_border_enable 进度条是否有边框 progress_gradient_enable 进度条颜色是否渐变 progress_start_color 从上到下进度条开始的渐变色 ...

u013346208的博客 6777

YOLOv11涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇| 引入FAAFusion傅里叶角对准融合模块,促进高低频特征融合,增强模型在小目标、密集目标检测和旋转目标检测任务高效涨点

🔥本文提出FAAFusion傅里叶角对准融合模块,用于改进YOLOv11网络模型。该模块通过在特征金字塔融合阶段对齐高低层特征的方向信息,缓解传统FPN直接融合带来的方向冲突问题。FAAFusion利用傅里叶旋转等变性原理,在频域估计主方向并进行特征对齐,显著提升了多尺度特征表达的一致性与有效性。实验表明,该方法在DOTA等遥感数据集上取得了新的最先进水平,特别适用于旋转目标检测任务。文章详细介绍了模块原理、结构优势,并提供了三种不同的YOLOv11改进配置方案和完整的核心代码实现。

Ai缝合怪、助力小伙伴高效发论文 152

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

垂直进度条VerticalProgressBar的实现

第一次写自定义,这个还是比较简单,查了下一般自定义都需要重写onDraw()和onMeasure()方法,这里也无例外。本例中只需在原ProgressBar源码的基础上做一些简单的修改。 原理就是将水平滚动条经过旋转竖起来,需要注意的是经旋转后原来的高变成了现在的宽,高变成了现在的宽。 代码如下: public class VerticalProgressBar extends Prog

xuan521521的博客 3069

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

vertical ProgressBar

转载地址:http://android-coding.blogspot.com/2013/02/implement-vertical-progressbar.html http://stackoverflow.com/questions/3926395/android-set-a-progressbar-to-be-a-vertical-bar-instead-of-horizontal

615

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

竖直ProgressBar(VerticalProgressBar),不用那么麻烦

ProgressBar(设置了progressBarStyleHoriziontal) 竖直ProgressBar 发现一个bug,就是竖直方向的时候,如果设置宽度大于高度,显示出来的竖直ProgressBar宽度可能只显示出来一半。

学习飞翔 6881

在android中怎么定义垂直,android 实现垂直的ProgressBar

I had recently come across the need for a vertical progress bar but was unable to find a solution using the existing Progress Bar widget. The solutions I came across generally required an extension of...

weixin_35125597的博客 533

竖直(垂直)VerticalSeekBar和VerticalProgressBar

最近想做竖直(垂直)VerticalSeekBar和VerticalProgressBar,

ITjianghuxiaoxiong的专栏 3977

android 竖向的progress bar

http://android-dev-examples.blogspot.jp/2014/09/android-custom-vertical-progressbar.html Android custom vertical progressbar Vertical gradient progress Layout : xmlns:an

愤怒的油条 3544

android自定义进度条样式,android 进度条ProgressBar样式设置

普通圆形ProgressBar该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中。一般只要在XML布局中定义就可以了。android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical">此时,没有设置...

weixin_35907524的博客 879

android 垂直的开关_android 实现垂直的ProgressBar

I had recently come across the need for a vertical progress bar but was unable to find a solution using the existing Progress Bar widget. The solutions I came across generally required an extension of...

weixin_39617470的博客 311

Android---垂直的进度条(VerticalSeekBar、VerticalProgressBar)

在做播放器的时候使用到垂直的拖动条,在github搜索了一下,拿了一个开源的来用下。       核心部分就是:               在视图上重新绘画一次,将画布旋转90度。                canvas.rotate(-90);   //旋转屏幕90度        canvas.translate(-getHeight(), 0); //设置画布的原点为控件的高。

yubestming_job的专栏 2883
上一篇: Android软键盘挡住输入框
下一篇: Android 内存泄漏
Swuagg
Swuagg 新星创作者: 移动开发技术领域 新星创作者: 移动开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄10年 2355粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值