您的位置:首页 > 其它

自定义圆角ImageView MyCircleImageView

2016-03-24 18:04 363 查看
相关注释在源码里都有 这里我直接贴出源码

1.先从Activity中获取到bitmap

private MyCircleImageView iv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iv= (MyCircleImageView) findViewById(R.id.myview);

iv.setImageResource(R.mipmap.dog);

}

2.在View里获取bitmap的宽高(图片的宽高) 控件的宽高

3.按比例缩放图片

4.重写onDraw方法

5.OK

下面是源码:

package an.com.myview;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.ImageView;

/**

* Created by An on 2016/3/24.

*/

public class MyCircleImageView extends ImageView{

private Bitmap bitmapRect;
private Bitmap bitmapCircle;
private Canvas canvas;
private Paint paint;
private String TAG= "MyCircleImageView";

public MyCircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);

}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int w=bitmapCircle.getWidth();//bitmapCircle是正方形  所以getWidth跟getHight一样
//重新定义一个图层  大小跟circle一样  四个角度透明
int layer=canvas.saveLayer(0,0,w,w,null,Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(bitmapRect,0,0,null);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(bitmapCircle,0,0,paint);
canvas.restoreToCount(layer);//使用图层
}
/**
* 初始化画布   获取得到的图片宽高  并画圆
*
*/
private void setCanvas(int width){
paint=new Paint(Paint.ANTI_ALIAS_FLAG);//初始化画笔
//根据控件的 (if 宽>高)高 或者(if 高>宽) 宽来创建一个bitmap
bitmapCircle=Bitmap.createBitmap(width,width, Bitmap.Config.ARGB_8888);
canvas=new Canvas(bitmapCircle);
canvas.drawCircle(width/2,width/2,width/2,paint);//在bitmap的中心 画一个圆  半径为宽的一半
}

private Bitmap drawableToBitamp(Drawable drawable) {
BitmapDrawable bd = (BitmapDrawable) drawable;
return bd.getBitmap();
}

/**
* 计算控件的高度   然后再画内切圆
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
Log.i(TAG,"widthMeasureSpec=="+widthSize);
Log.i(TAG,"heightMeasureSpec=="+heightSize);
float x=(float) getMinSize(heightSize,widthSize)/getMinSize(bitmapRect.getHeight(),bitmapRect.getWidth());//图片缩小的比例
Matrix matrix=new Matrix();
matrix.setScale(x,x);
Bitmap resizeBmp = Bitmap.createBitmap(bitmapRect,0,0,bitmapRect.getWidth(),bitmapRect.getHeight(),matrix,true);//缩小后的图片
Log.i(TAG,"onMeasure= resizeBmp.getWidth() ="+resizeBmp.getWidth());
setCanvas(getMinSize(resizeBmp.getHeight(),resizeBmp.getWidth()));
bitmapRect=resizeBmp;//缩小后的图片赋值给原来的图片
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private int getMinSize(int height,int width){
return Math.min(height,width);
}

/**
* imageView的一些设置方法  需要什么方法自己写就好了
* @param id
*/
public void setImageResource(int id){
bitmapRect=BitmapFactory.decodeResource(getResources(),id);
Log.i(TAG,"bitmapRect.getWidth=="+bitmapRect.getWidth());
Log.i(TAG,"bitmapRect.getHeight=="+bitmapRect.getHeight());
}

public void setDrawable(Drawable drawable){
bitmapRect=drawableToBitamp(drawable);
}

public void setBitmap(Bitmap bitmap){
bitmapRect=bitmap;
}


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