你的位置:首页 > 操作系统

[操作系统]自定义控件之圆头像

先上代码:

package com.andy.oschina_android.widget;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.util.AttributeSet;import android.view.View;public class CircleImageView extends View {  private Paint mPaint;  private RectF mBound;  private Bitmap mImageBitmap;  private float mRadius;  public CircleImageView(Context context) {    this(context,null);  }  public CircleImageView(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    init();  }  private void init() {    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);    mBound = new RectF();  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    int vw,vh;    vw = vh =0;    int iw,ih;    if(mImageBitmap==null){      iw = ih = 0;    }else{      iw = mImageBitmap.getWidth();      ih = mImageBitmap.getHeight();    }    int size = Math.min(iw,ih);    setMeasuredDimension(size,size);  }  @Override  protected void onSizeChanged(int w, int h, int oldw, int oldh) {    if(w!=oldw||h!=oldh){      /**       * 设置边界,剧中显示       */      int iw,ih;      if(mImageBitmap==null){        iw = ih = 0;      }else{        iw = mImageBitmap.getWidth();        ih = mImageBitmap.getHeight();      }      int size = Math.min(getHeight(),getWidth());      mBound.set(0,0,size,size);      mRadius = size/2;      if(mPaint.getShader()!=null){        Matrix m = new Matrix();        if(iw>ih){          m.setTranslate((iw-ih)/2,0);        }else{          m.setTranslate(0,(ih-iw)/-2);        }        mPaint.getShader().setLocalMatrix(m);      }    }  }  @Override  protected void onDraw(Canvas canvas) {    if(mImageBitmap!=null) {      canvas.drawRoundRect(mBound, mRadius, mRadius, mPaint);    }  }  /**   * 由图片决定View的大小   * @param bitmap   */  public void setImageBitmap(Bitmap bitmap){    if(bitmap!=mImageBitmap){      mImageBitmap = bitmap;      if(bitmap!=null) {        BitmapShader bs = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        mPaint.setShader(bs);      }else{        mPaint.setShader(null);      }      requestLayout();    }  }}

效果图:

思路:

这里实现圆的方式是定义一个正方形的View,通过圆角(1/4圆)的方式实现

以上代码主要做了三件事:

1、测量view的大小

2、设定绘制编辑,设置偏移量

3、设置BitmapSharder

方法onMeasure()在测量view大小时被调用,在该方法中的末尾调用了setMeasuredDimension();,这个方法设置的高宽就是最终view的高宽。

在onSizeChanged()方法中根据图片的大小设置了矩形边界和圆角半径;同时创建一个Matrix,通过Matrix设置偏移量,最后把Matrix通过方法setLocalMatrix()设置给了BitmapShader对象,这里的BitmapShader对象就是setImageBitmap()方法中创建的。

onDraw()代码一目了然,就不在说了。

setImageBitmap()是自定义方法,用于将图片设置给view。在这个方法中主要干了两个事情,一是创建一个BitmapShader,用于存放图片的像素;二是请求重绘控件。

 


去阳朔的旅游团价格去阳朔旅游必去景点去阳朔旅游要多少钱去阳朔旅游最佳路线去阳朔旅游最佳时间2015年五一旅游有什么需要注意的事项? 2015年日历表都有哪些节日? 2015五一放假几号到几号?如何安排? 预防H7N9禽流感,饮食应注意哪些事项? 新兴天露山漂流节好玩吗?2015天露山漂流节玩什么? 上林霞客古渡景区一日游攻略?霞客古渡景区路线? 新兴天露山漂流节什么时候开始?天露山漂流节几号开始? 上林霞客古渡怎么坐车?霞客古渡景区坐车要多久? 丽江户外乐园怎么走? 三亚的淡季和旺季是什么时候? 什么时候去三亚好? 云南松赞林寺门票多少? 丽江纳西古乐好玩吗? 2015深圳欢乐谷圣诞节活动介绍?深圳欢乐谷圣诞节简单介绍? 2015深圳欢乐谷圣诞节活动夜场几点开始?深圳欢乐谷圣诞节夜场好玩吗? 2015深圳欢乐谷圣诞节儿童票多少钱?深圳欢乐谷圣诞节适合多大儿童玩? 2015圣诞节深圳欢乐谷门票多少钱?深圳欢乐谷圣诞节门票价格? CY241V8ASXC-14 Datasheet CY241V8ASXC-14 Datasheet CY241V8ASXC-14T Datasheet CY241V8ASXC-14T Datasheet CY24271ZXC Datasheet CY24271ZXC Datasheet 梅溪湖灯展 梅溪湖灯展 梅溪湖灯展 牛姆林好玩吗 牛姆林好玩吗 牛姆林好玩吗 六一儿童节哪里好玩 六一儿童节哪里好玩 六一儿童节哪里好玩