您的位置:首页 > 移动开发 > Android开发

《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();
   };

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 上传 进度