自定义圆角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{
}
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; }
}
相关文章推荐
- Android - MyViewPagerActivity.java
- 锐起无盘机部署
- Ubuntu 14.04的vim编辑器配置Python开发环境
- 如何根据年月计算月份最大天数
- 请求的链式处理—职责链模式
- AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构
- inverse lazy fetch
- poj_2251
- VS2015 程序运行调试错误总结
- AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构
- chkconfig
- JavaScript中的setTimeout和setInterval传入的函数不能带参数的解决方法
- poj_2251
- NoSuchMethodException <init>()
- vlookup使用案例
- 健康1
- CentOS最小化安装系统开启网卡
- 抄书问题2 (复制书稿) 单调性优化dp + 序列划分模型
- Linux日志文件与syslog函数介绍
- iOS 真机Could not find Developer Disk Image