Android中制作进度框和环形进度条的简单实例分享

进度框

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import java.util.Random; public class ObliqueProgressbar extends View { private Paint mPaint; private float mProgress; public ObliqueProgressbar(Context context) { this(context, null); } public ObliqueProgressbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ObliqueProgressbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mPaint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mProgress == 0) return; //碎片雨 mPaint.setColor(Color.parseColor("#a96ecb")); mPaint.setStrokeWidth(3); Random random = new Random(); int sx, sy; for (int i = 0; i < 200; i++) { sx = random.nextInt(getWidth() + 10); sy = random.nextInt(getHeight() + 10); // canvas.drawLine(sx, sy, sx+random.nextInt(5), sy+random.nextInt(5), mPaint); canvas.drawCircle(sx, sy, random.nextInt(5) + 1, mPaint); } //进度 mPaint.setColor(Color.parseColor("#6AFFFFFF")); mPaint.setStrokeWidth(15); float x = mProgress * getWidth(); for (int i = 0; i < x; i += 30) { canvas.drawLine(i - 30, -10, i + 30, getHeight() + 10, mPaint); } } public void setProgress(float progress) { this.mProgress = progress; invalidate(); } }

环形进度条

先来看一下效果:

下面直接上代码了:

ckage com.stone.circleprogressbar.view; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.view.View; import com.stone.circleprogressbar.R; public class CircleProgressbar extends View { private float mProgress; private int mBarColor; private int mTextColor; private float mTextSize; public CircleProgressbar(Context context) { this(context, null); } public CircleProgressbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleProgressbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressbar); mBarColor = array.getColor(R.styleable.CircleProgressbar_barColor, Color.GRAY); mTextColor = array.getColor(R.styleable.CircleProgressbar_textColor, Color.GRAY); mProgress = array.getFloat(R.styleable.CircleProgressbar_progress, 0); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void setProgress(float count) { mProgress = count; invalidate(); } @Override protected void onDraw(Canvas canvas) { int w = getWidth(); int h = getHeight(); int strokeWidth = 20; int radius = w / 2 - strokeWidth / 2;//大圆 半径 Bitmap barBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Paint paint = new Paint(); paint.setAntiAlias(true); //抗锯齿 paint.setStrokeWidth(strokeWidth); //描边宽 paint.setDither(true); //防抖动 /* 外边框 */ Canvas circleCanvas = new Canvas(barBitmap); RectF rect = new RectF(0, 0, w, h); paint.setColor(Color.argb(0x11, 0xcc, 0xcc, 0xcc)); // circleCanvas.drawRect(rect, paint); //没啥用 只是看外边框的 /* 内圆 */ paint.setColor(Color.CYAN); paint.setShader(new LinearGradient(0, 0, w, h, Color.RED, Color.GREEN, Shader.TileMode.CLAMP)); circleCanvas.drawCircle(w / 2, h / 2, radius - strokeWidth / 2, paint); paint.setShader(null); /* 外圆 */ paint.setColor(mBarColor); paint.setStyle(Paint.Style.STROKE); circleCanvas.drawCircle(w / 2, h / 2, radius, paint); /* 圆弧 */ paint.setShader(new LinearGradient(0, 0, w, h, new int[]{Color.GREEN, Color.MAGENTA, Color.CYAN, Color.RED}, new float[]{0.2f, 0.5f, 0.7f, 1.0f}, Shader.TileMode.CLAMP)); float cur = mProgress * 360 * 0.01f; circleCanvas.drawArc(new RectF(strokeWidth / 2, strokeWidth / 2, w - strokeWidth / 2, h - strokeWidth / 2), 360 - 45, cur, false, paint); paint.setShader(null); /* 文本 */ paint.setColor(mTextColor); if (mTextSize == 0) { calcTextSize(paint, w, strokeWidth); } else { paint.setTextSize(mTextSize); } paint.setTextAlign(Paint.Align.LEFT);//default String percent = mProgress + "%"; paint.setStyle(Paint.Style.FILL); circleCanvas.drawText(percent, w / 2 - paint.measureText(percent) / 2, h / 2 + paint.getTextSize() / 2, paint); canvas.drawBitmap(barBitmap, 0, 0, paint); } /** * 计算并设置最适合的textSize * * @param paint * @param max 最大宽度 * @param offset 偏移 */ private void calcTextSize(Paint paint, int max, int offset) { float width = paint.measureText("99.99%"); while (width < max * 3 / 5) { paint.setTextSize(paint.getTextSize() + 5); width = paint.measureText("92.88%") + offset / 2; } mTextSize = paint.getTextSize(); } }

设置进度刷新显示  调用  setProgress()即可。

时间: 2024-07-28 21:13:24

Android中制作进度框和环形进度条的简单实例分享的相关文章

Android中制作进度框和环形进度条的简单实例分享_Android

进度框 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import java.util.Random; public class ObliqueProgressbar ext

Android中RecyclerView上拉下拉,分割线,多条目的实例代码

//activity的xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity

js中 计算两个日期间的工作日的简单实例_javascript技巧

实例如下: //起始日期,/pattern/是正则表达式的界定符,pattern是要匹配的内容,只用于第一个符号的匹配,g为全局匹配标志 var beginDate = new Date("2013-01-01".replace(/-/g, "/")); //结束日期 var endDate = new Date("2013-01-31".replace(/-/g, "/")); //日期差值,即包含周六日.以天为单位的工时,

通过jquery-ui中的sortable来实现拖拽排序的简单实例_jquery

1.引入文件 <script src="{sh::PUB}js/jquery-1.10.1.min.js"></script> <link rel="stylesheet" href="Public/css/jquery-ui.min.css"> <script src="{sh::PUB}js/jquery-ui.min.js"></script> 2.给元素附上s

Android 复制文本内容到系统剪贴板的最简单实例(分享)

这个例子很简单,直接上截图和代码. 布局文件activity_copy.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

[置顶] 我的Android进阶之旅------&amp;gt;Android中制作和查看自定义的Debug版本Android签名证书

      Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和的证书指纹SHA1码来识别的,如百度地图SDK.这样如果使用默认自动生成的debug的话就会给开发调试工作带来一些麻烦.这时可以通过修改正式的release keystore,生成一份"遵守规矩"的临时自定义调试证书给开发时用,就方便多了,具体方法如下.        首先要知道默认的debug证书位置在哪里,打开Eclipse-->Windows-->Preferenc

Android 中Crash时如何获取异常信息详解及实例

Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,

Android中使用AsyncTask实现文件下载以及进度更新提示_Android

Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handter即可实现.AsyncTask是抽象类.AsyncTask定义了三种泛型类型Params,Progress和Result: Params启动任务执行的输入参数,比如,HTTP请求的URL. Progress后台任务执行的百分比. Result后台执行任务最终返回的结果,比如String.

Android中使用自定义View实现下载进度的显示

一般有下载功能的应用都会有这样一个场景,需要一个图标来标识不同的状态.之前在公司的项目中写过一个,今天抽空来整理一下. 一般下载都会有这么几种状态:未开始.等待.正在下载.下载结束,当然有时候会有下载出错的状态.等待状态是指用户点击开始下载,但是线程池中没有空闲的线程来处理该次下载,所以状态为等待. 效果图:     这里我只是演示了一下下载和暂停的状态,其他状态没有演示,在代码中设置就可以了. 实现代码: 1.自定义View 1 public class DownloadPercentView