为了达到美观的效果,项目中的所有图片显示都是圆角显示。然而Android的ImageView没有圆角属性,而让UI把所有图片都处理成圆角,也不合适。这里采用自定义的方法来自定义一个支持圆角的ImageView,然后在布局中引用这个类来布局就可以了。同时,该自定义ImageView还支持绘制圆形和椭圆形的ImageView。可以根据实际需要来选择。 这个代码是网上找的 和大家一起分享下


import android.content.Context;
import android.graphics.*;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;import java.lang.ref.WeakReference;/*** 使用Xfermode渲染方案实现圆角矩形、椭圆ImageView* @author caizhiming**/
public class XCRoundImageViewByXfermode extends ImageView{//数据定义private Paint mPaint;  private Xfermode mXfermode = new PorterDuffXfermode(Mode.DST_IN);  private Bitmap mMaskBitmap; //用来做private int mRoundBorderRadius;//圆角大小private int mType;//类型:圆形、圆角或椭圆private WeakReference<Bitmap> mBufferBitmap;//使用缓存技术,避免每次都执行onDrawpublic static final int TYPE_CIRCLE = 1;//圆形public static final int TYPE_ROUND = 2;//圆角矩形public static final int TYPE_OVAL = 3;//椭圆形private static final int DEFAULT_ROUND_BORDER_RADIUS = 10;//默认圆角大小 //构造方法public XCRoundImageViewByXfermode(Context context){this(context, null);}public XCRoundImageViewByXfermode(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubmPaint = new Paint();mPaint.setAntiAlias(true);//设置消除锯齿mType = TYPE_ROUND;mRoundBorderRadius = DEFAULT_ROUND_BORDER_RADIUS;}/*** 测量view的大小*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);//如果类型是圆形,则强制设置view的宽高一致,取宽高的较小值 if(mType == TYPE_CIRCLE){int width = Math.min(getMeasuredWidth(),getMeasuredHeight());setMeasuredDimension(width, width);}}/*** 绘制view的内容*/@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stub//从缓存中取出bitmapBitmap bmp = (mBufferBitmap == null ? null:mBufferBitmap.get());if(bmp == null || bmp.isRecycled()){//如果没有缓存存在的情况//获取drawableDrawable drawable = getDrawable();//获取drawable的宽高int dwidth = drawable.getIntrinsicWidth();int dheight = drawable.getIntrinsicHeight();Log.v("czm","dwidth="+dwidth+",width="+getWidth());if(null != drawable){bmp = Bitmap.createBitmap(getWidth(), getHeight(),  Config.ARGB_8888); float scale = 1.0f;//创建画布Canvas drawCanvas = new Canvas(bmp);//按照bitmap的宽高,以及view的宽高,计算缩放比例;因为设置的src宽高//比例可能和imageview的宽高比例不同,这里我们不希望图片失真;  if(mType == TYPE_CIRCLE)  {//如果是圆形  scale = getWidth() * 1.0F / Math.min(dwidth, dheight);  }else if (mType == TYPE_ROUND || mType == TYPE_OVAL)  {//如果是圆角矩形或椭圆 // 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;//缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;  scale = Math.max(getWidth() * 1.0f / dwidth, getHeight()  * 1.0f / dheight);  }Log.v("czm","scale="+scale);//根据缩放比例,设置bounds,即相当于做缩放图片  drawable.setBounds(0, 0, (int)(scale * dwidth), (int)(scale * dheight));drawable.draw(drawCanvas);//获取bitmap,即圆形、圆角或椭圆的bitmapif(mMaskBitmap == null || mMaskBitmap.isRecycled()){mMaskBitmap = getDrawBitmap();}//为paint设置Xfermode 渲染模式mPaint.reset();mPaint.setFilterBitmap(false);mPaint.setXfermode(mXfermode);//绘制不同形状drawCanvas.drawBitmap(mMaskBitmap, 0, 0,mPaint);mPaint.setXfermode(null);//将准备好的bitmap绘制出来  canvas.drawBitmap(bmp, 0, 0, null);  //bitmap缓存起来,避免每次调用onDraw,分配内存  mBufferBitmap = new WeakReference<Bitmap>(bmp); }}else{//如果缓存还存在的情况mPaint.setXfermode(null);  canvas.drawBitmap(bmp, 0.0f, 0.0f, mPaint);  return; }}/*** 绘制不同的图形Bitmap*/private Bitmap getDrawBitmap(){Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),  Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);  Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  paint.setColor(Color.BLACK);  if(mType == TYPE_CIRCLE){//绘制圆形 canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2,  paint); }else if(mType == TYPE_ROUND)  {//绘制圆角矩形canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),  mRoundBorderRadius, mRoundBorderRadius, paint);  }else if(mType == TYPE_OVAL ){//绘制椭圆canvas.drawOval(new RectF(0, 0, getWidth(), getHeight()), mPaint);}return bitmap;  }/*** 因为使用了缓存技术,所以需要在invalidate中做些回收释放资源的处理*/@Overridepublic void invalidate() {// TODO Auto-generated method stubmBufferBitmap = null;if(mMaskBitmap != null){mMaskBitmap.recycle();mMaskBitmap = null;}super.invalidate();}public int getRoundBorderRadius() {return mRoundBorderRadius;}public void setRoundBorderRadius(int mRoundBorderRadius) {if(this.mRoundBorderRadius != mRoundBorderRadius){this.mRoundBorderRadius = mRoundBorderRadius;invalidate();}}public int getType() {return this.mType;}public void setType(int mType) {if(this.mType != mType){this.mType = mType;invalidate();}}
}

效果如图

自定义圆角的ImageView 还可以实现图片的圆形、椭圆形展示。相关推荐

  1. Android Glide加载图片成圆形

    今天,简单讲解android使用glide加载图片成圆形. 这个很简单,因为之前需要在RecyclerView里加载圆形图片,所以在网上查找了资料,很简单就解决了. 1.导入依赖 implementa ...

  2. android glide圆形图片,Android Glide加载图片成圆形

    释放双眼,带上耳机,听听看~! 今天,简单讲解android使用glide加载图片成圆形. 这个很简单,因为之前需要在RecyclerView里加载圆形图片,所以在网上查找了资料,很简单就解决了. 1 ...

  3. 安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例

    安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例,图片压缩处理逻辑 本文旨在介绍自定义View的实现 ...

  4. Android开发之自定义圆角矩形图片ImageView

    android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap ...

  5. Android自定义圆角矩形图片ImageView

    //自定义的圆形的ImageView类的实现代码如下:package com.xc.xcskin.view;import android.content.Context; import android ...

  6. Android开发之自定义圆角矩形图片ImageView的实现 - Jamy Cai

    android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap ...

  7. android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

  8. Android图片缓存框架 - Glide自定义圆角 (五)

    目录 1. Glide API 2. Glide导入包 3. Glide 7种加载图片方式 4. 取消加载 5 Glide加载GIF 6. Glide的RequestOption 7. Glide自定 ...

  9. Android自定义圆角圆形图片

    转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/79463977 说起Android里面的自定义圆角圆形图片,已经算是老生常谈的话题了, ...

  10. Android 图片圆角,自定义圆角的弧度,或者直接设置为圆形图片

    1,创建RoundImageView继承自ImageView或者继承AppCompatImageView import android.content.Context; import android. ...

最新文章

  1. 把集成测试和单元测试写一起是一种什么体验?
  2. 权威解答495个最常遇到的C语言问题
  3. 雷柏鼠标怎么配对接收器_四款蓝牙鼠标的详细使用体验对比
  4. js实现webSocket客户端
  5. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  6. vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课
  7. 学习python的错误总结
  8. 数组去重和两个数组求交集
  9. 优化器——梯度下降优化算法综述
  10. 简单理解JavaScript中的闭包
  11. 加拿大计算机科学薪酬,加拿大最好找工作及薪酬最高的十大专业介绍
  12. Labelme直接生成灰度图
  13. 【杂记】01:王者荣耀,再见?
  14. 行内元素之间产生的间隙
  15. 教你一个快速掌握知识的学习方法
  16. 网络安全等级保护等级保护对象的安全保护等级
  17. c语言生成excel文件简书,通过xlwings生成Excel文件
  18. 【Win10微信截图】Win10的wechat截图模糊修正
  19. 初识frameset
  20. [转]我在赶集网的两个月 7.4(完结)

热门文章

  1. 牛客练习赛53 老瞎眼 pk 小鲜肉[思维+离线+线段树]
  2. windows筛选键
  3. Kesci“魔镜杯”风控算法大赛复赛解决方案(转载)
  4. tp房产源码tpfangchan-fangcms-tphouse火车头采集软件方法
  5. 腾讯御安全之AI反病毒引擎白皮书
  6. Android Studio 里sync下载慢,怎么办?
  7. 尚学堂视频笔记六:多线程
  8. [转载]GMT地形数据总结
  9. 如何获取任意小程序的AppId和页面路径?
  10. 我的世界java版execute指令_命令/execute