相关注释在源码里都有 这里我直接贴出源码
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;
}
}
***Note:需要在activity里定义并设置图片
mImageView= (MyCircleImageView) findViewById(R.id.main_iv);
mImageView.setImageResource(R.mipmap.guide);