Android弧形步数进度

Android自定义圆弧进度条(半圆进度条) 圆弧渐变色进度条带指示 圆弧宽高可自由修改 Android 自定义圆弧进度条,支持设置为圆形进度条,弧度圆形渐变色,进度指示条,进度文字。 阅读详情

Android弧形步数进度

一、效果图

在这里插入图片描述

二、代码实现

2.1 自定义属性

    <declare-styleable name="QQStepView">
        <attr name="outColor" format="color"/>
        <attr name="outWidth" format="dimension"/>
        <attr name="innerColor" format="color"/>
        <attr name="innerWidth" format="dimension"/>
        <attr name="step" format="string"/>
    </declare-styleable>

2.2 代码实现

package com.example.layoutdemo.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;

import androidx.annotation.Nullable;

import com.example.layoutdemo.R;

public class QQStepView extends View {
    private static final String TAG = "QQStepView";
    private int mOuterColor;
    private int mOuterWidth;
    private int mInnerColor;
    private int mInnerWidth;

    private Paint mOutPaint;



    private int maxStep = 100;
    private int currentStep = 20;
    private Paint mInnerPaint;

    private Paint mTextPaint;
    public QQStepView(Context context) {
        this(context,null);
    }

    public QQStepView(Context context, @Nullable AttributeSet attrs) {
        this(context,attrs,0);
    }

    public QQStepView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context,attrs,defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.QQStepView);
        mOuterColor = typedArray.getColor(R.styleable.QQStepView_outColor,getResources().getColor(R.color.black));
        mOuterWidth = typedArray.getDimensionPixelSize(R.styleable.QQStepView_outWidth,10);
        mInnerColor = typedArray.getColor(R.styleable.QQStepView_innerColor,getResources().getColor(R.color.design_default_color_on_primary));
        mInnerWidth = typedArray.getDimensionPixelSize(R.styleable.QQStepView_innerWidth,5);
        typedArray.recycle();

        mOutPaint = new Paint();
        mOutPaint.setAntiAlias(true);
        mOutPaint.setColor(mOuterColor);
        mOutPaint.setStyle(Paint.Style.STROKE);
        mOutPaint.setStrokeWidth(mOuterWidth);
        mOutPaint.setStrokeCap(Paint.Cap.ROUND);


        mInnerPaint = new Paint();
        mInnerPaint.setAntiAlias(true);
        mInnerPaint.setColor(mInnerColor);
        mInnerPaint.setStrokeWidth(mInnerWidth);
        mInnerPaint.setStrokeCap(Paint.Cap.ROUND);
        mInnerPaint.setStyle(Paint.Style.STROKE);

        mTextPaint = new Paint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(getTextSp(40));
    }
    private float getTextSp(float px) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,px,getResources().getDisplayMetrics());
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int size = widthSize < heightSize ? widthSize:heightSize;
        setMeasuredDimension(size,size);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

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

        RectF rectF = new RectF();
        rectF.left = mOuterWidth/2;
        rectF.right = getWidth()-mOuterWidth/2;
        rectF.top = mOuterWidth/2;
        rectF.bottom = getHeight()-mOuterWidth/2;
        canvas.drawArc(rectF,135,275,false,mOutPaint);

        RectF innerRectF = new RectF();
        innerRectF.left = mOuterWidth/2;
        innerRectF.right = getWidth()-mOuterWidth/2;
        innerRectF.top = mOuterWidth/2;
        innerRectF.bottom = getHeight()-mOuterWidth/2;
        float sweepAngle = 275 * ((float)currentStep / maxStep);
        Log.d(TAG,"sweepAngle"+ sweepAngle);
        canvas.drawArc(innerRectF,135,sweepAngle,false,mInnerPaint);


        // 绘制文本

        String stepText = currentStep + "";
        Rect textRect = new Rect();
        mTextPaint.getTextBounds(stepText,0,stepText.length(),textRect);
        int dx = getWidth()/2 - textRect.width()/2;
        Paint.FontMetricsInt fontMetricsInt = mTextPaint.getFontMetricsInt();
        int dy = (fontMetricsInt.bottom - fontMetricsInt.top)/2 - fontMetricsInt.bottom;
        int baseLine = getHeight()/2 + dy;
        canvas.drawText(stepText,dx,baseLine,mTextPaint);
    }

    public synchronized void setMaxStep(int maxStep){
        this.maxStep = maxStep;
    }
    public synchronized void setCurrentStep(int currentStep) {
        this.currentStep = currentStep;
        postInvalidate();
    }
}

2.3 使用控件

 <com.example.layoutdemo.widget.QQStepView
        app:outWidth="20dp"
        android:id="@+id/step_view"
        app:outColor="@color/teal_200"
        android:layout_width="200dp"
        app:innerColor="@color/black"
        app:innerWidth="20dp"
        android:layout_height="200dp"/>
        final QQStepView qqStepView = findViewById(R.id.step_view);
//        qqStepView.setMaxStep(100);
//        qqStepView.setCurrentStep(80);
        qqStepView.setMaxStep(3000);
        ValueAnimator valueAnimator = ObjectAnimator.ofFloat(0,2000);
        valueAnimator.setDuration(5000);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float animatedValue = (float) animation.getAnimatedValue();
                qqStepView.setCurrentStep((int)animatedValue);
            }
        });
        valueAnimator.start();

三、源码下载地址

Android自定义View

Android计步器小Demo 描述android计步器的实现,自定义的一个弧形进度条,记步通过手机的传感器来实现,也就是说不支持传感器的机子(应该很老的了吧)就没有效果。 阅读详情

相关推荐

Android自定义半圆进度条

android自定义半圆进度条,可以自己根据里面备注的参数,调整半圆的长度。这里是使用说明:http://blog.youkuaiyun.com/beibaokongming/article/details/79002646

Android自定义View03-实现弧形进度条效果

1.创建一个自定义View : QQStepView,让所有的构造方法都执行到同一个,并且在这个构造方法中去获取xml里设置的属性。想让内圈弧形动起来,就要修改不断的内圈圆弧的绘制角度,提供两个设置方法,去设置最大值和当前值。使用了属性动画来生成当前值(2s内从0增长到3000),生成设置给QQStepView。2.重写onMeasure()方法,确定view的宽高,保证是个正方形。外圈颜色、内圈颜色、弧宽度、数字文本大小、数字文本颜色。写到这里,就能绘制出初始图形了。在外部调用这两个方法。

qq_34888036的博客 939

Android自定义圆弧进度条(手动控制进度)

Android手动控制进度的自定义圆弧进度条,可通过拖动或者按钮控制进度

自定义View之可拖拽的圆环进度条(android)

可手动控制的圆环进度条

一个黑曼巴的博客 2045

Android自定义带动画的半圆环型进度效果

本文实例为大家分享了Android半圆环型进度效果的具体代码,供大家参考,具体内容如下 package com.newair.ondrawtext; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import androi

用Matlab系统辨识工具箱搞定温控系统建模:从阶跃响应到传递函数(附完整代码)

本文详细介绍了如何使用Matlab系统辨识工具箱进行温控系统建模,从阶跃响应数据采集到传递函数参数辨识的全过程。通过实际案例和完整代码,帮助工程师快速掌握PID控制参数整定技巧,提升温控系统设计效率。特别适合单片机开发者和自动化控制工程师参考。

weixin_30736301的博客 310

自定义View之仿QQ运动步数进度效果

前言 今天接着上一篇来写关于自定义View方面的东西,因为我近期也是在学习整理这方面的知识点,所以我把学习的笔记都写成博文放到这个Android自定义View的专栏里了,仅作为自己学习笔记所用,今天的内容是关于Paint画笔方面的一个应用,做一个Demo——仿QQ运动步数进度效果。 一、案例效果分析 首先上一张效果图,大家一起来看一下: 通过上面的这张图,我们来分析一下,该如何去实现...

江湖人陆仁甲 557

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3501

android自定义计步器形状,Android自定义View仿QQ运动步数效果

本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下今天我们实现下面这样的效果:首先自定义属性:自定义View代码如下:/*** Created by Michael on 2019/11/1.*/public class MyQQStep extends View {private int out_color;private int inner_color;pri...

weixin_29288653的博客 223

零成本矩阵玩法:1人运营5个账号的自动化工具链配置(2025全平台实战)

通过“AI内容生产+工具链分发+自动化变现”的组合拳,即使是新手也能实现1人运营5个账号的规模化收益。关键在于选对工具与设计标准化流程。未来,矩阵运营的竞争将聚焦于工具使用效率与数据洞察深度,快人一步者方能抢占先机!

TuFuir的博客 3786

【Codex Sandbox 与审批机制:小白也能看懂的实用教程】

这篇教程介绍了Codex工具中的沙盒(Sandbox)和审批(Approvals)机制,帮助用户安全高效地使用Codex协作。沙盒限制Codex访问范围,审批机制则控制敏感操作权限。文章详细讲解了五种常见模式:最安全的安全只读浏览、只读非交互、仓库内编辑、Auto预设和不推荐的YOLO模式。还提供了新手使用路径建议、配置示例和实战场景范式,包括如何测试沙盒行为、不同系统下的实现方式以及常见问题解答。最后附上速查清单,帮助用户快速选择合适的权限组合。

zsr154278963的博客 6712

实现记步样式的进度条

之前看到一种记步进度的条的样式 就想怎么去实现的 然就去动手去实现。代码如下package com.zyf.customview.view; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.TypedArray; import android.gr...

yuf0812的博客 488

NX二次开发新建组件

NXOpen新建组件

qq_39541524的博客 329

自定义View之QQ运动

/** * Created by Cwm on 2018/3/1. * 仿QQ运动 * 思路分析: * 1、先画外圆弧 * 2、再画内圆弧 * 3、画内部字体颜色 */ public class QQSports extends View { private int mExcircleColor = Color.RED; private int mFilletCo...

weixin_39166019的博客 195

Android SystemUI——自定义状态栏和导航栏(十二)

通过前面的文章内容,我们了解了Android系统原生的状态栏StatusBar和车载系统状态栏CarStatusBar的启动流程以及视图构建流程,这里我们来简单的看一下自定义状态栏和导航栏视图的实现流程。

小旭的专栏 2012

S32K144 UDSdoCAN 升级刷写实现笔记

本篇旨在描述如何开发“车规级”的软件升级程序,通过在S32K144平台上实现基于UDSdoCAN的刷写升级功能,带你一步步建立安全升级的“工程思维”,在这里既能收获经验还能获得工程源码、测试脚本,助你起飞,避坑提速!

汽车电子软件领域知识分享 811

重学 Android 自定义 View 系列(三):自定义步数进度条

本篇文章主要是实现仿QQ步数View,很老的一个View了,但技术永不落后,开搂!为了使该控件在 XML 布局文件中可配置,我们需要定义一些自定义属性,例如外圈颜色、内圈颜色、边框宽度、文本大小和文本颜色。这些属性可以通过文件来定义:

WriteBug001的博客 1125

AMBA-CHI协议详解(五)

 每个事务由许多不同的packets组成,这些数据包通过互连(interconnect)传输。packets内的一组ID域段用于提供有关包的附加信息。

Crazzy_M的博客 1964

ColorArcProgressBar:优雅的弧形进度条库

ColorArcProgressBar:优雅的弧形进度条库 如果你在寻找一个能够为你的Android应用增添视觉魅力的进度条组件,那么绝对值得你一试。这是一个开源的、高度可定制的弧形进度条库,它以丰富的颜色和动态效果为你的UI设计注入活力。 项目简介 ColorArcProgressBar是一个轻量级的Android库,旨在提供一种美观且易于使用的弧形进度条。它的主要特性包括渐变色支持、自定义起...

gitblog_00089的博客 521

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 自定义view实现仿QQ运动步数进度效果

最近公司在策划一个新的项目,原型还没出来,再说这公司人都要走没了,估计又要找工作了,所以必须要学习,争取每个写个关于自定义view方面的,这样几个月积累下来,也能学习到东西,今天就带来简单的效果,就是仿QQ运动步数的进度条效果.在这就不分析了,直接贴代码,自定义属性:&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;resources&gt; ...

zhouguizhi 1098

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android计步器简书,自定义View-仿QQ运动步数进度效果

自定义View-仿QQ运动步数进度效果一、写在前面(1) 图一,仿QQ步数运行效果(2) 图二,完整的圆效果完整代码请看这二、正文开始(1)首先来个三部曲,自定义属性,布局设置,属性获取1)自定义属性,新建attrs.xml2)布局设置3)属性获取(2) 我们先来解决,宽高的问题,重写onMeasure方法(3) 现在就是各种绘制1)绘制文本2)绘制外弧3)绘制内弧4)文本的动态效果(4)最后在A...

weixin_36323859的博客 271

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

自定义View | 仿QQ运动步数进度效果

项目GitHub地址 思路 固定不动的蓝色大圆弧 动画变动的红色小圆弧 中间的步数文字显示 相关的自定义属性 比如固定不动的大圆弧, 我们不能写死他的蓝色颜色属性, 要提供一个颜色的自定义属性给用户自定义配置; 圆弧的宽度也是要可以自定义的; 自定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> ... ...

aaLiweipeng的博客 379

Android 渐变圆环,圆形进度条效果实现,android百度地图开发

private void init(AttributeSet attrs, int defStyle) { mFinishWheelPaint = new Paint(); mFinishWheelPaint.setColor(Color.rgb(100, 113, 205)); mFinishWheelPaint.setStyle(Paint.Style.STROKE);// 空心 mFinishWheelPaint.setStrokeCap(Paint.Cap.ROUND);// 圆角画笔 mFinis

m0_66155412的博客 324

android 圆形渐变进度条CircleProgressBar的开源框架

1.类似QQ健康中当日步数圆弧显示ColorArcProgressBar https://github.com/Shinelw/ColorArcProgressBar 2 支持进度条渐变的 还有动画时间的  https://github.com/PleaseCallMeCoder/CircleProgressBar 3 支持渐变的 原型进度的类型比较多 htt

韦大人orz 1万+

android 弧线动画,【Android自定义View实战】之仿QQ运动步数圆弧及动画,Dylan计步中的控件StepArcView...

在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的。1.先看效果图这里写图片描述2.效果图分析功能说明:黄色的代表用户设置的总计划锻炼步数,红色的代表用户当前所走的步数。初步分析:完全自定义View重写onDraw()方法,画圆弧。3.画一个圆弧必备知识在Canvas中有一个画圆弧的方法...

weixin_34849131的博客 454

ArcProgressStackView 使用教程

ArcProgressStackView 使用教程 1. 项目介绍 ArcProgressStackView 是一个开源的 Android 库,用于在弧形模式下展示进度条,并提供全面的信息和控制功能。该库允许开发者自定义进度条的外观和行为,包括动画、阴影、圆角、拖动/查找等功能。ArcProgressStackView 支持多种参数设置,适用于各种进度展示需求。 2. 项目快速启动 2.1 添加依...

gitblog_00200的博客 701
上一篇: Android实现两种颜色的TextView
下一篇: Android不同形状切换
libodev
博客等级 码龄14年 2粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值