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

FPGA从入门到精通(2) - LUT

LUT:(look up table) 查找表 今天我要讲的与FPGA CLB相关的第一节LUT。根据上一节课的课程大纲,讲CLB应该是讲SLICEL(SLICEM)。不过当我打开用户手册,看了一下SLICE的结构(图一),一眼望去,这是分分钟会劝退入门者。为了让读者更好的接受以及理解,所以我打算先讲清楚它里面的每一个基本单元(LUT, 进位链,MUX,寄存器,几乎所有的FPGA器件的SLICE都是这四大件组成,只是组合不太一样而已),然后再将他们联系在一起,和读者一步步推倒出SLICE的结构。 图1​

Jasper灬兰的博客 1万+

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

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

江湖人陆仁甲 557

【UV打印机】PrintExp打印软件教程(六)-高级模式(马达)

输入高级模式密码进入高级模式高级模式界面有操作栏、控制栏、参数栏及参数界面操作栏名称功能说明文件加载数据从板卡加载参数保存将参数保存到主板退出退出高级模式固件导入固件导入配套版本下的固件配置*xpcfx导出固件导出当前使用的固件配置*xpcfx导入波形文件导入对应的波形文件*waf操作初始化系统继续初始化动作复位X轴复位回原点控制栏可进行小车运动、闪喷操作(此闪喷为点击进行闪喷,不受平台位置限制),无清洗功能。

Print World的专栏 3112

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

camera——HAL层知识分享

CameraHAL层是Android相机系统的核心中间层,负责连接Framework层与硬件驱动层。它通过标准化接口解耦软硬件,实现跨平台兼容性,同时为厂商提供硬件定制空间。主要功能包括:设备管理、数据流处理、参数控制以及图像优化。关键子系统涵盖预览、拍照、录像、对焦与曝光等模块,采用HAL3的"请求-响应"模型实现精细控制。性能优化重点关注启动时间、帧率稳定性和延迟控制。通过分层架构设计(接口层-核心层-适配层)和缓冲池机制,确保高效数据传输和硬件资源调度。

2302_77429403的博客 2077

避坑指南:Vue调用摄像头常见6大报错解决方案(navigator.mediaDevices全兼容方案)

本文深入剖析了在Vue应用中调用摄像头时常见的六大报错,如权限拒绝、设备未找到等,并提供了基于navigator.mediaDevices的全兼容解决方案。内容涵盖从HTTPS环境配置、浏览器兼容性处理到摄像头资源管理与高级错误处理,旨在帮助开发者构建稳定可靠的企业级摄像头应用。

Black的专栏 341

实现记步样式的进度条

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

yuf0812的博客 488

数字后端DRC Violation定位与自动化修复:Innovus与Calibre协同实战

设计规则检查(DRC)是芯片tapeout前确保版图可制造性的关键验证环节。在数字后端流程中,Calibre作为signoff级物理验证工具,会依据代工厂SVRF规则文件对GDS进行严格几何检查;而Innovus则提供快速迭代的in-design DRC反馈。两者协同成为工程师定位violation、保障流片成功的主流工作流。面对成千上万条DRC violation,高效的定位与分类思路、跨工具映射技巧,以及基于Tcl脚本的自动化修复方法,能大幅缩短物理验证周期。本文从DRC的分层定位出发,结合Innovu

weixin_29185167的博客 336

自定义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

某知名系统漏洞挖掘与利用思路探索

本文以安全研究为目的,分享对该套系统的代码审计和漏洞挖掘过程,文中所提到的漏洞均已提交给CNVD&CITIVD,请勿用做非法用途。

C20220511的博客 1905

【人工智能】AI驱动值班巡检Agent(Hermes)

传统运维值班巡检场景中,存在四大核心痛点:本项目基于 Agent+Skills+浏览器自动化 架构,构建了具备自我进化能力的AI值班员,核心逻辑流如下:

奶爸的编程之路,也就一周冷个三天 178

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

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

WriteBug001的博客 1125

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 300

ColorArcProgressBar:优雅的弧形进度条库

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

gitblog_00089的博客 521

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

zhouguizhi 1098

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

Camera2Demo

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

自定义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、付费专栏及课程。

余额充值