显示圆形图片CircleImageView

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.ColorFilter;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.graphics.RectF;

import android.graphics.Xfermode;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.widget.ImageView;

public class CircleImageViewextends ImageView {

private Bitmapmask;

  private Paintpaint;

  private int borderColor=0xffffffff;

  private int roundWidth=0;

  private int roundHeight=0;

  private int borderWidth=0;

  private static final XfermodeMASK_XFERMODE;

  static {

PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;

      MASK_XFERMODE =new PorterDuffXfermode(localMode);

  }

public CircleImageView(Context paramContext) {

super(paramContext);

      this.setScaleType(ScaleType.CENTER_CROP);

  }

public CircleImageView(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

      this.setScaleType(ScaleType.CENTER_CROP);

  }

public CircleImageView(Context paramContext,

                          AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

      this.setScaleType(ScaleType.CENTER_CROP);

  }

private BitmapmakeDst(int w, int h)

{

Bitmap bm = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);

        Canvas c =new Canvas(bm);

        Paint p =new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(Color.parseColor("#ffffffff"));

        //c.drawOval(new RectF(0, 0, w, h), p);

        c.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), w, h, p);

        return bm;

    }

@Override

  protected void onDraw(Canvas paramCanvas) {

Drawable localDrawable = getDrawable();

      if (localDrawable ==null)

return;

      try {

initPaint();

        //获取drawable的宽和高

        int dWidth = localDrawable.getIntrinsicWidth();

        int dHeight = localDrawable.getIntrinsicHeight();

        //创建bitmap

//    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),Config.ARGB_8888);

//创建画布

//      Canvas drawCanvas = new Canvas(bitmap);

//缩放比例

        float scale =1.0f;

        //按照bitmap的宽高,以及view的宽高,计算缩放比例;因为设置的src宽高比例可能和imageview的宽高比例不同,这里我们不希望图片失真;

//      if (dWidth == dHeight)

//      {

//          // 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;

//          scale =  Math.max(getWidth() * 1.0f / dWidth, getHeight()

//                * 1.0f / dHeight);

//      } else

//      {

//          scale = getWidth() * 1.0F / Math.min(dWidth, dHeight);

//      }

        scale =  Math.max(getWidth() *1.0f / dWidth, getHeight()

*1.0f / dHeight);

        //根据缩放比例,设置bounds,相当于缩放图片了

        localDrawable.setBounds(0, 0, (int) (scale * dWidth),

              (int) (scale * dHeight));

//      localDrawable.draw(drawCanvas);

        float f1 = getWidth();

        float f2 = getHeight();

        int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, Canvas.ALL_SAVE_FLAG);

        int j = getWidth();

        int k = getHeight();

//      localDrawable.setBounds(0, 0, j, k);

        localDrawable.draw(paramCanvas);

        if ((this.mask ==null) || (this.mask.isRecycled())) {

if(this.roundHeight==0&&this.roundWidth==0){

this.roundHeight = getHeight();

              this.roundWidth = getWidth();

            }

this.mask = makeDst(roundWidth, roundHeight);

        }

paramCanvas.drawBitmap(this.mask, 0.0F, 0.0F, this.paint);

        drawBorder(paramCanvas, j, k);

        drawPercent(paramCanvas,paint);

        paramCanvas.restoreToCount(i);

return;

      }catch (Exception localException) {

localException.printStackTrace();

      }

}

private void drawBorder(Canvas canvas, final int width, final int height) {

if(this.borderWidth==0){

return;

      }

Paint mBorderPaint =new Paint();

      mBorderPaint.setStyle(Paint.Style.STROKE);

      mBorderPaint.setAntiAlias(true);

      mBorderPaint.setColor(this.borderColor);

      mBorderPaint.setStrokeWidth(borderWidth);

      int step =borderWidth/2;

      canvas.drawRoundRect(new RectF(0+step,step, getWidth()-step, getHeight()-step), width-borderWidth, height-borderWidth, mBorderPaint);

      /**

* 坐标x:view宽度的一般 坐标y:view高度的一般 半径r:因为是view的宽度-border的一半

*/

      //canvas.drawCircle(width >> 1, height >> 1, (width - border) >> 1,    mBorderPaint);

  }

public void setRound(int roundWidthDP,int roundHeightDP){

this.roundHeight=roundHeightDP;

      this.roundWidth = roundWidthDP;

      float density =this.getContext().getResources().getDisplayMetrics().density;

      roundWidth = (int) (roundWidth*density);

      roundHeight = (int) (roundHeight*density);

  }

/**

  * @Title: setBorderColor

  * @Description: TODO(设置边框颜色值)

  * @param @param color  argb值 设定文件

  * @return void    返回类型

  * @throws

  */

  public void setBorder(int color,int widthPX){

if(color==-1){

//      borderColor=0xffececec;

        borderColor=0xffffffff;

      }

else{

this.borderColor=color;

      }

this.borderWidth = widthPX;

  }

public void setBorder(int widthPX){

borderColor=0xffececec;

      this.borderWidth = widthPX;

  }

@Override

  public void setColorFilter(ColorFilter cf) {

// TODO Auto-generated method stub

      super.setColorFilter(cf);

      initPaint();

      paint.setColorFilter(cf);

  }

private void initPaint(){

if (this.paint ==null) {

Paint localPaint1 =new Paint();

        this.paint = localPaint1;

        this.paint.setFilterBitmap(false);

        Paint localPaint2 =this.paint;

        Xfermode localXfermode1 =MASK_XFERMODE;

        @SuppressWarnings("unused")

Xfermode localXfermode2 = localPaint2

.setXfermode(localXfermode1);

      }

}

/////////////////////////////////////////////////////////////////////////////

    public enum Status {

RUNNING, NONE

    }

private static final int DEFAULT_TEXTCOLOT =0xff0074a2;

    private static final int DEFAULT_TEXTSIZE =32;

    private float mPercent;

    private int percent;

    private BitmapmScaledBitmap;

    private float mLeft;

    private int mSpeed =10;

    private int mRepeatCount =0;

    private StatusmFlag = Status.NONE;

    private int mTextColot =DEFAULT_TEXTCOLOT;

    private int mTextSize =DEFAULT_TEXTSIZE;

    public void setTextColor(int color) {

mTextColot = color;

    }

public void setTextSize(int size) {

mTextSize = size;

    }

public void setPercent(float percent) {

mFlag = Status.RUNNING;

        mPercent = percent;

        this.percent = (int)(percent*100);

        postInvalidate();

    }

public void setStatus(Status status) {

mFlag = status;

    }

public void clear() {

mFlag = Status.NONE;

        if (mScaledBitmap !=null) {

mScaledBitmap.recycle();

            mScaledBitmap =null;

        }

postInvalidate();

    }

protected void drawPercent(Canvas canvas,Paint paint) {

if (mFlag == Status.RUNNING) {

if (mScaledBitmap ==null) {

Bitmap mBitmap = BitmapFactory.decodeResource(getContext().getResources(), R.mipmap.percent_wave);

//                mScaledBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), getHeight(), false);

                mScaledBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), mBitmap.getHeight(), false);

                mBitmap.recycle();

                mBitmap =null;

                mRepeatCount = (int) Math.ceil(getWidth() /mScaledBitmap.getWidth() +0.5) +1;

            }

for (int idx =0; idx

canvas.drawBitmap(mScaledBitmap, mLeft + (idx -1) *mScaledBitmap.getWidth(), -mPercent * getHeight(), null);

            }

if(percent<=100){

String str =percent +"%";

              paint.setColor(mTextColot);

              paint.setTextSize(mTextSize);

              canvas.drawText(str, (getWidth() - paint.measureText(str)) /2, getHeight() /2 +mTextSize /2, paint);

              mLeft +=mSpeed;

                if (mLeft >=mScaledBitmap.getWidth())

mLeft =0;

                postInvalidateDelayed(30);

            }

}

}

@Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

      super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }

/**

* 绘制形状

    * @return

    */

  public BitmapgetBitmap()

{

Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),

            Bitmap.Config.ARGB_8888);

      Canvas canvas =new Canvas(bitmap);

      Paint paint =new Paint(Paint.ANTI_ALIAS_FLAG);

      paint.setColor(Color.BLACK);

      if (getWidth()!= getHeight())

{

canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),

              roundWidth, roundHeight, paint);

      }else

      {

canvas.drawCircle(getWidth() /2, getWidth() /2, getWidth() /2,

              paint);

      }

return bitmap;

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容