自定义view——环形进度条,带progress值

第一步:新建文件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);

}

}

}

时间: 2024-08-29 17:06:07

自定义view——环形进度条,带progress值的相关文章

Android简易实战教程--第十七话《自定义彩色环形进度条》

转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203533   点击打开链接 在Android初级教程里面,介绍了shape用法的理论知识,再来完成这个小案例将会变得非常简单哦.(欢迎学习阅读):http://blog.csdn.net/qq_32059827/article/details/52203347 点击打开链接 这一篇就针对这个知识点,完成一个自定义的彩色进度条.系统自带的环形进度条是黑白相间的,如果你不是色盲,

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

Android 自定义View——动态进度条

效果图: 这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧.顶部.右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的.比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画部分就可以了.不多说了,上代码了. 代码 自定义

自定义环形进度条

自定义环形进度条 效果图: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package com.qiao.circleprogress_forexample; import android.app.Activity; impo

Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)

/** * 带文本提示的进度条 */ public class TextProgressBar extends ProgressBar { private String text; private Paint mPaint; public TextProgressBar(Context context) { super(context); initText(); } public TextProgressBar(Context context, AttributeSet attrs, int d

Andorid自定义圆形渐变色进度条的从实现到开源

信自己也是一种信仰. 写在前面的话 3月初我在自定义控件概述中挖下的几个坑,前一段时间已经基本填完了,自定义控件的几种实现方式也分别写了demo来进行说明.今天我们来聊一聊如何把自己封装一个圆形渐变色进度条控件开源到github,并且上传到jcenter方便别人远程依赖.先看下效果图: 连接github并提交新项目 前提条件: 安装Git客户端(下载地址) 有GitHub账号 创建新项目并提交到Github: 在AndroidStudio中新建一个项目 配置Git:Settings -> Ver

Android自定义圆角矩形进度条2

效果图: 或 方法讲解: (1)invalidate()方法 invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时, 调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉.一般在自定义控件中会用到这个方法. (2)RectF方法的应用 RectF是用来绘画矩形的方法. RectF(left,top,right,bottom),四个参数的含义分别是父控件距离矩形左上右下

低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

       一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android

Android View 之进度条+拖动条+星级评论条....

PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条...       进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此为之设置一个进度条使应用程序的运行状态更好的反馈给客户...这也就是进度条的作用...因此一般的应用程序都会加入进度条...进度条分为圆形进度条和线性的进度条...目的都是一样的,只是展示的效果是不同的...用代码讲解一下... <LinearLayout xmlns:android="htt