自定义View实现Android圆形进度条
发布时间:2020-12-14 23:19:18 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 通过继承Android的View类,重写onDraw方法。 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bit
|
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考
通过继承Android的View类,重写onDraw方法。
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
public class CycleView extends View {
Paint mPaint;
int progress = 30;
int start_degree = -90;
public CycleView(Context context,AttributeSet attrs) {
super(context,attrs);
InitResources(context,attrs);
}
int background_int;
int progress_int;
float layout_width_float;
int textColor_int;
float textSize_float;
int max_int;
Drawable thumb_double;
int thumbSize_int;
private void InitResources(Context context,AttributeSet attrs) {
TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.windows);
background_int = mTypedArray.getColor(R.styleable.windows_background,0xFF87cfe8);
progress_int = mTypedArray.getColor(R.styleable.windows_progressDrawable,0xFFabd800);
layout_width_float = mTypedArray.getDimension(R.styleable.windows_layout_width,7);
textColor_int = mTypedArray.getColor(R.styleable.windows_textColor,0xFFada1de);
textSize_float = mTypedArray.getDimension(R.styleable.windows_textSize,50);
max_int = mTypedArray.getInt(R.styleable.windows_max,100);
progress = mTypedArray.getInt(R.styleable.windows_progress,20);
thumb_double = mTypedArray.getDrawable(R.styleable.windows_thumb);
thumbSize_int = mTypedArray.getInt(R.styleable.windows_thumbSize,30);
mTypedArray.recycle();
if (thumb_double == null) {
Bitmap bitmap = Bitmap.createBitmap(thumbSize_int,thumbSize_int,Bitmap.Config.ARGB_8888);
// 图片画片
Canvas cas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setStyle(Style.FILL);
paint.setColor(0xFF68ba32);
int center = thumbSize_int / 2;
int radius = center - 4;
cas.drawCircle(center,center,radius,paint);
thumb_double = new BitmapDrawable(getResources(),bitmap);
}
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawProgressView(canvas);
}
private void drawProgressView(Canvas canvas) {
InitOval(canvas);
drawBackground(canvas);
drawProgress(canvas);
drawProgressText(canvas);
}
RectF oval;
private void InitOval(Canvas canvas) {
int center = getWidth() / 2;
int radius = (int) (center - thumbSize_int / 2);
// 画布中央减去半径就是左上角
int left_top = center - radius;
// 画布中央加上半径就是右下角
int right_bottom = center + radius;
if (oval == null) {
oval = new RectF(left_top,left_top,right_bottom,right_bottom);
}
}
/**
* 绘制进度文字
*
* @param canvas
*/
private void drawProgressText(Canvas canvas) {
mPaint.setTextSize(textSize_float);
mPaint.setColor(textColor_int);
mPaint.setStrokeWidth(2);
mPaint.setStyle(Style.FILL);
String progresstext = progress + "%";
float text_left = (getWidth() - mPaint.measureText(progresstext)) / 2;
FontMetrics fontMetrics = mPaint.getFontMetrics();
// 绘制文字是底部对齐
float text_top = (float) ((getHeight() / 2 + Math.ceil(fontMetrics.descent - fontMetrics.ascent) / 2));
canvas.drawText(progresstext,text_left,text_top,mPaint);
}
private void drawProgress(Canvas canvas) {
// 设置进度
mPaint.setColor(progress_int);
mPaint.setStrokeWidth(layout_width_float);
float seek = 0;
if (max_int > 0) {
seek = (float) progress / max_int * 360;
}
canvas.drawArc(oval,start_degree,seek,false,mPaint);
canvas.save();
int center = getWidth() / 2;
int radius = (int) (center - thumbSize_int / 2);
double cycle_round = (seek + start_degree) * Math.PI / 180;
float x = (float) (Math.cos(cycle_round) * (radius) + center - thumbSize_int / 2);
float y = (float) (Math.sin(cycle_round) * (radius) + center - thumbSize_int / 2);
thumb_double.setBounds(0,thumbSize_int);
canvas.translate(x,y);
thumb_double.draw(canvas);
canvas.restore();
}
private void drawBackground(Canvas canvas) {
mPaint.setStrokeWidth(layout_width_float);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
// 设置背景
mPaint.setColor(background_int);
canvas.drawArc(oval,360,mPaint);
}
/**
* 查看Seekbar源码
*
* @param progress
*/
public synchronized void setProgress(int progress) {
if (progress > max_int) {
progress = max_int;
}
this.progress = progress;
postInvalidate();
}
public int getProgress() {
return this.progress;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (thumb_double != null) {
thumb_double.setCallback(null);
thumb_double = null;
}
}
}
然后是XML,因为要用到自定义属性 <?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 参考Seekbar -->
<declare-styleable name="windows">
<!-- 背景颜色 -->
<attr name="background" format="color" />
<!-- 进度颜色 -->
<attr name="progressDrawable" format="color" />
<!-- 宽度 -->
<attr name="layout_width" format="dimension" />
<!-- 字体颜色 -->
<attr name="textColor" format="color" />
<!-- 字体大小 -->
<attr name="textSize" format="dimension" />
<!-- 最大进度 -->
<attr name="max" format="integer" />
<!-- 进度 -->
<attr name="progress" format="integer" />
<!-- 进度点 -->
<attr name="thumb" format="reference" />
<!-- 进度点宽高 -->
<attr name="thumbSize" format="integer" />
</declare-styleable>
</resources>
最后是在代码里的用法 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.windows.canvas.CycleView
android:layout_centerInParent="true"
xmlns:windows="http://schemas.android.com/apk/res/com.finals.canvas"
android:layout_width="150dp"
android:layout_height="150dp" />
</RelativeLayout>
以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
