《Android-圆形图片处理(上传)进度显示》
2016-03-09 15:32
549 查看
package com.darongtong.drtproject.view.imageview; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.util.AttributeSet; import com.darongtong.drtproject.view.CircleImageView; /** * 带处理进度的圆形ImageView * @author WalterWang * */ public class ProgressCircleImageView extends CircleImageView { private Paint mPaint;// 画笔 private Paint mBitPaint;// 画图像 Context context; /** * 图像处理进度 */ int progress = 0; public ProgressCircleImageView(Context context) { this(context, null); } public ProgressCircleImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressCircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; mPaint = new Paint(); // 初始化paint mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBitPaint.setFilterBitmap(false); mBitPaint.setDither(true); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setAntiAlias(true); // 消除锯齿 mPaint.setFilterBitmap(false); mPaint.setStyle(Paint.Style.FILL); if (progress > 0 && progress<100){ // 保存为单独的层 int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), mBitPaint, Canvas.ALL_SAVE_FLAG); canvas.drawBitmap(makeDst(), 0, 0, mBitPaint); mBitPaint.setXfermode(new PorterDuffXfermode(Mode.DST_OUT)); if (getHeight() > getWidth()) { canvas.drawBitmap(makeSrc(), 0, (getHeight() - getWidth() * progress / 100) - (((getHeight() - getWidth()) / 2)), mBitPaint); } else { canvas.drawBitmap(makeSrc(), 0, getHeight() - getHeight() * progress / 100, mBitPaint); } mBitPaint.setXfermode(null); canvas.restoreToCount(saveCount); } /** * 如果是非圆形图形用下面代码 */ // mPaint.setColor(Color.parseColor("#55000000")); // canvas.drawRect(0, 0, getWidth(), // getHeight()-getHeight()*progress/100, mPaint); // canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mPaint); // mPaint.setColor(Color.parseColor("#00000000"));//全透明 // canvas.drawRect(0, getHeight()-getHeight()*progress/100, getWidth(), // getHeight(), mPaint); /** mPaint.setTextSize(30); mPaint.setColor(Color.parseColor("#FFFFFF")); mPaint.setStrokeWidth(2); Rect rect = new Rect(); mPaint.getTextBounds("100%", 0, "100%".length(), rect); canvas.drawText(progress + "%", getWidth() / 2 - rect.width() / 2, getHeight() / 2, mPaint); */ } /** * 创建一个矩形bitmap,作为src图 * * @return */ private Bitmap makeSrc() { Bitmap bm = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bm); Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setColor(Color.parseColor("#FFFFFF")); c.drawRect(0, 0, getWidth(), getHeight(), p); return bm; } /** * 创建一个圆形bitmap,作为dst图 * * @return */ private Bitmap makeDst() { Bitmap bm = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bm); Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setColor(Color.parseColor("#55000000")); c.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, p); return bm; } /** * 设置进度 * @param progress */ public void setProgress(int progress) { this.progress = progress; postInvalidate(); }; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories