自定义圆角ImageView MyCircleImageView

相关注释在源码里都有 这里我直接贴出源码
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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值