第一步:新建文件Circle.java
package com.lancy.demo.democircle.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import com.lancy.demo.democircle.R;
public class Circle extends View {
private Paint mPaint;
private float strokeWidth = 10;
private float progress = 0;
private int defaultColor;
private int activeColor;
public Circle(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.circle);
strokeWidth = a.getDimension(R.styleable.circle_strokeWidth, strokeWidth);
progress = a.getFraction(R.styleable.circle_progress, 360, 100, 10);
defaultColor = a.getColor(R.styleable.circle_defaultColor, Color.GRAY);
activeColor = a.getColor(R.styleable.circle_activeColor, Color.BLUE);
a.recycle();
}
public Circle(Context context) {
this(context, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int minimumWidth = getSuggestedMinimumWidth();
final int minimumHeight = getSuggestedMinimumHeight();
int viewWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
int viewHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
setMeasuredDimension(viewWidth, viewHeight);
}
private int resolveMeasured(int measureSpec, int desired) {
int result = 0;
int specSize = MeasureSpec.getSize(measureSpec);
switch (MeasureSpec.getMode(measureSpec)) {
case MeasureSpec.UNSPECIFIED:
result = desired;
break;
case MeasureSpec.AT_MOST:
result = Math.max(specSize, desired);
break;
case MeasureSpec.EXACTLY:
default:
result = specSize;
}
return result;
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
float h = width > height ? height : width;
Paint p = new Paint();
p.setColor(defaultColor);
p.setStyle(Paint.Style.STROKE);
p.setAntiAlias(true);
p.setStrokeWidth(strokeWidth);
RectF oval1 = new RectF(strokeWidth / 2, strokeWidth / 2, h-strokeWidth / 2, h-strokeWidth / 2);
canvas.drawArc(oval1, 0, 360, false, p);
p.setColor(activeColor);
canvas.drawArc(oval1, 270, progress, false, p);//小弧形
}
public void setProgress(float progress) {
this.progress = progress / 100 * 360;
invalidate();
}
public float getProgress() {
return progress * 100 / 360;
}
}
第二步  新建attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="circle">
<attr name="strokeWidth" format="dimension"></attr>
<attr name="progress" format="fraction"></attr>
<attr name="defaultColor" format="color"></attr>
<attr name="activeColor" format="color"></attr>
</declare-styleable>
</resources>
第三步  建布局文件 circle.xml
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:circle="http://schemas.android.com/apk/res/com.lancy.demo.democircle" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="50dp" 
android:gravity="center" 
android:orientation="vertical" >

<com.lancy.demo.democircle.widget.Circle 
android:id="@+id/circle" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
circle:defaultColor="#95a1aa" 
circle:activeColor="#1290dd" 
circle:strokeWidth="10dp" 
circle:progress="25%" 
/>

<!-- -->

</LinearLayout>

第三步 建MainActivity.java
package com.lancy.demo.democircle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import com.lancy.demo.democircle.widget.Circle;
public class MainActivity extends Activity {
Circle circle;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.circle);
circle = (Circle) findViewById(R.id.circle);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
registerReceiver(new TimeReceiver(), filter);
}
class TimeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("TimeReceiver----------------", intent.getAction());
circle.setProgress(circle.getProgress()-1);
}
}

转载于:https://www.cnblogs.com/yuanyuan-5683/p/4213556.html

自定义view——环形进度条,带progress值相关推荐

  1. 基于canvas 2D实现微信小程序自定义组件-环形进度条

    基于canvas 2D实现微信小程序自定义组件-环形进度条 最近开发一个小程序项目博闻金榜答题小程序,需要使用到一个可以显示答题倒计时的组件,基于进度条实现,下面就主要介绍基于canvas2D实现一个 ...

  2. 自定义View圆环进度条

    相信大家都对自定义view有所了解,今天给大家展示一下我自己写的小Demo,一个自定义环形进度条,进度在不断加载的过程中颜色呈现渐变效果,并且中间的Textview展示进度值,有两个button控制暂 ...

  3. 微信小程序自定义封装环形进度条组件

    我们先看效果-选不了视频没办法了 说明:此组件对圆的宽度,进度条的宽度.颜色.旋转方向,还有进度条的值,还有两端是否要圆角都进行了动态化,无坑可放心用,参数解释在注释里,我就不写了 .效果图看到尾部的 ...

  4. Android Paint应用之自定义View实现进度条控件

    在上一篇文章<Android神笔之Paint>学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 上图就是本文要 ...

  5. 自定义圆环形进度条实现

    最近项目里边要用进度条,进度条中间展示进度,底部展示label,因为这个组件用的地方多,所以我就直接封装了一个通用组件. 先看一下效果图: 功能有: 圆环的颜色和进度可以自定义: 中间文字可以自定义: ...

  6. android canvas_Android 自定义View篇(七)实现环形进度条效果

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  7. CircleProgressBar 带载入动画的环形进度条

    CircleProgressBar 项目地址:AlexMofer/CircleProgressBar 带载入动画的环形进度条,可高度配置,支持配置成表盘. 预览   要求 minSdkVersion ...

  8. 自定义环形进度条RoundProgressBar

    一.效果图: Canvas画圆环说明: 圆环宽度不必在意,只是画笔宽度设置后达到的效果. 二.实现步骤 1.自定义View-RoundProgressBar 2.设置属性resources(decle ...

  9. 用emWin的2D绘图函数画一个带圆形端点的环形进度条

    先上效果图,首先是顺时针转: 然后是逆时针转: 大概讲一下思路吧,首先讲一下顺时针是怎么弄的,很简单. 画圆弧函数GUI_DrawArc有起始角度a0和终止角度a1两个参数,且a0必须小于a1否则无法 ...

  10. 【UE5】自定义环形进度条、方形进度条

    UE5 实现 自定义环形进度条 1.1 新建Material 1.2 设置User Interface 1.3 使用PS绘制图形 (中间为透明,外部为白色的png图片) 方形: 星形: 1.4 图形显 ...

最新文章

  1. 关于学习Python的一点学习总结(10->设置字符串格式)
  2. 微信小程序开发之选项卡
  3. echarts 多次通过setOption改变图形数据时 数据有时不进行变化
  4. 禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧
  5. java tld 方法重载_自定义标签
  6. IE下的一个安全BUG —— 可实时跟踪系统鼠标位置
  7. 自学python推荐书-学习python求推荐一波书籍?
  8. python工资高还是java-深圳python工资高还是java
  9. React Native Modal组件 Android覆盖状态栏
  10. html标签asp/,HTML标签及ASP函数速查表
  11. Android 新浪微博开放平台应用 android签名怎么获得
  12. ES集群单机(单节点/多节点)搭建
  13. itools电脑显示服务器维护,win10系统iTools无法打开且服务无法启动的具体技巧
  14. 鸡汤_产品经理职责概要
  15. 企业进行客户关系管理的重要性是什么
  16. 深井泵房无人值守系统 泵站无人值守平台 智慧水务
  17. 平台卡卷API文档分享
  18. MySQL_11_范式优化
  19. 计算机公式求时间差公式,excel 时间差计算方法
  20. (三)腾讯云开发工程师TCA题库(题目含详细解析)

热门文章

  1. JDK数字格式,由星期几变为周几
  2. 通过ln链接目录到目标
  3. Ubuntu用Apache2快速搭建一个HTTP文件服务器
  4. 环形电流计算公式_圆环电流的电流密度
  5. WM_CLOSE、WM_DESTROY、WM_QUIT区别
  6. 大表join大表_阿里开发规范:超过三张表,禁止join骚操作
  7. python 打印三维数据_Python中的面向对象编程(二):数据隐藏和对象打印
  8. 安装python3-dev_ubuntu16.04安装python3.7
  9. 如何看注解的源码_我们为什么要看源码、应该如何看源码?
  10. 类的虚函数表和虚函数在内存中的位置