Android开发中经常会用到圆形图片,比如在用户头像设置,现在提供三种主要实现方式:

方案一:使用第三方图像框架 Fresco

1、添加依赖

dependencies {compile 'com.facebook.fresco:fresco:0.14.1'
}

2、初始化

public class MyApplication extends Application{@Overridepublic void onCreate() {super.onCreate();Fresco.initialize(this);}
}

3、修改 manifest

android:name=".MyApplication"

4、添加网络权限

 <uses-permission android:name="android.permission.INTERNET"/>

5、文件布局

需要添加命名空间

 xmlns:fresco="http://schemas.android.com/apk/res-auto"

引入

<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/drawee_img"fresco:roundAsCircle="true"fresco:roundedCornerRadius="20dp"android:layout_width="80dp"android:layout_height="80dp" />

6、使用

    SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.drawee_img);Uri uri = Uri.parse("http://p7.qhimg.com/dr/200_200_/t01b2e3a907f6ecc29d.jpg");draweeView.setImageURI(uri);

方案二:自定义View

public class CircleImageView extends ImageView {private Paint mPaint; //画笔private int mRadius; //圆形图片的半径private float mScale; //图片的缩放比例public CircleImageView(Context context) {super(context);}public CircleImageView(Context context, AttributeSet attrs) {super(context, attrs);}public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//因为是圆形图片,所以应该让宽高保持一致int size = Math.min(getMeasuredWidth(), getMeasuredHeight());mRadius = size / 2;setMeasuredDimension(size, size);}@Overrideprotected void onDraw(Canvas canvas) {mPaint = new Paint();Bitmap bitmap = drawableToBitmap(getDrawable());//初始化BitmapShader,传入bitmap对象BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);//计算缩放比例mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());Matrix matrix = new Matrix();matrix.setScale(mScale, mScale);bitmapShader.setLocalMatrix(matrix);mPaint.setShader(bitmapShader);//画圆形,指定好中心点坐标、半径、画笔canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);}//写一个drawble转BitMap的方法private Bitmap drawableToBitmap(Drawable drawable) {if (drawable instanceof BitmapDrawable) {BitmapDrawable bd = (BitmapDrawable) drawable;return bd.getBitmap();}int w = drawable.getIntrinsicWidth();int h = drawable.getIntrinsicHeight();Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, w, h);drawable.draw(canvas);return bitmap;}
}

使用:

 <mgzxc.cn.module2.CircleImageViewandroid:id="@+id/image1"android:layout_width="200dp"android:layout_height="200dp"android:layout_centerInParent="true"android:scaleType="centerCrop"android:src="@drawable/gangtiexia"/>

方案三:进行图片剪切

方式一

public static Bitmap createCircleImage(Bitmap source) { int length = source.getWidth() < source.getHeight() ? source.getWidth() : source.getHeight(); Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap target = Bitmap.createBitmap(length, length, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(target); canvas.drawCircle(length / 2, length / 2, length / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(source, 0, 0, paint); return target; } 

方式二:

public static Bitmap createCircleImage(Bitmap source) { int width = source.getWidth();int height = source.getHeight();float raduis = Math.min(width, height) * 0.5f;Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//paint.setColor(Color.RED);//画布设置遮罩效果paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));//处理图像数据Bitmap bitmap = Bitmap.createBitmap(width, height, source.getConfig());Canvas canvas = new Canvas(bitmap);//bitmap的显示由画笔paint来决定canvas.drawCircle(width * 0.5f, height *0.5f, raduis, paint);return bitmap;
} 

与Picasso结合使用:

 Picasso.with(mContext).load(Constant.format(headUrl)).transform(new Transformation() {@Overridepublic Bitmap transform(Bitmap source) {source=createCircleImage(source);source.recycle();return bitmap;}//Picasso缓存bitmap,下次获取bitmap, 通过key//第一次调用用key 存入//第二次调用用key去取@Overridepublic String key() {Log.d(TAG, "key() called");return "key";}}).into(meHeader);

Android中图片圆形设置三种方法介绍相关推荐

  1. html图层透明度,ps图层透明度怎么调整?Photoshop中调整图层透明度的三种方法介绍...

    Photoshop里面怎么调整图层的透明度?作为一个"切图仔",切图的时候,看到总有透明的图层估计是最头痛的事,不知道其他人怎么样,个人却是最怕做透明的样式..扯远了,但确实因为要 ...

  2. Android中获取网络图片的三种方法

    android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...

  3. android中onclick事件失效,Android中OnClick事件的三种方法

    //第一种方式 Button Btn1 = (Button)findViewById(R.id.button1);//获取按钮资源 Btn1.setOnClickListener(new Button ...

  4. Android中传递对象的三种方法

    Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递. 序列化对象可以使用Ja ...

  5. Android中保存数据的三种方法

    一,Preferences Preferences是一个较轻量级的存储数据的方法,具体使用方法: 在A中保存值: SharedPreferences.Editor sharedata = getSha ...

  6. android全局计时_Android中使用定时器的三种方法

    本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第 ...

  7. 【在PowerPoint中插入视频的三种方法】

    为了能更好地帮助大家合理地在PowerPoint课件中插入和播放视频文件, 在PowerPoint中插入视频的三种方法 ,本文特向大家介绍PowerPoint中插入和处理视频的三种方法. 直接播放视频 ...

  8. matlab保存所有图,Matlab中图片保存的5种方法

    matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的. Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具 ...

  9. android 画布叠加,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...

最新文章

  1. Python的with...as的用法
  2. php里面的log是什么文件夹,用PHP生成自己的LOG文件
  3. Android传感器-开发指南
  4. 查数估获近千万元融资 ,用科技为金融赋能
  5. 现代数字影视 电影使用标准
  6. NOI数据结构:树套树
  7. Android Studio下gradle环境搭建
  8. 加密解密你了解多少?
  9. 简述线程,程序、进程的基本概念。以及他们之间关系是什么?
  10. sigmoid函数的求导过程
  11. re正则表达式7_{}
  12. python自动检测网站_Web全自动化测试Python + Pytest+Selenium+ Saucelabs 转
  13. 如何将Android手机用作调制解调器; 无需生根,Redux
  14. uac2+android,iBasso UAC
  15. 006-Archer@冯鹤楠 MySQL 打卡作业2
  16. JIRA消息通知打通钉钉群
  17. Linux磁盘分区及格式化简介,Linux硬盘分区及格式化学习笔记
  18. 如何使用Arcgis10.6在影像中画shp继而对影像做出裁剪
  19. 商业智能助力 银行业数据“挖金”
  20. Three.js基础之图元

热门文章

  1. 已解决selenium.common.exceptions.WebDriverException: Messag: ‘geckodriver‘ executable needs to be in PA
  2. 计算机是如何跑起来的百度云,《程序是怎样跑起来的》(下)
  3. MinGW与Clion下载安装及使用详解
  4. 用数组+链表实现哈希表
  5. 企查查api接口批量操作实战
  6. Unity 显示FPS
  7. python小组项目总结报告_给大家汇报一下我们学习小组的进展情况
  8. 记录一次teamview无法远程连接对方teamview的过程
  9. 备案需要域名证书吗?如何下载域名证书?
  10. uniapp对接微信公众号H5微信支付、分享、小程序隐藏右上角分享胶囊