Android中图片圆形设置三种方法介绍
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中图片圆形设置三种方法介绍相关推荐
- html图层透明度,ps图层透明度怎么调整?Photoshop中调整图层透明度的三种方法介绍...
Photoshop里面怎么调整图层的透明度?作为一个"切图仔",切图的时候,看到总有透明的图层估计是最头痛的事,不知道其他人怎么样,个人却是最怕做透明的样式..扯远了,但确实因为要 ...
- Android中获取网络图片的三种方法
android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...
- android中onclick事件失效,Android中OnClick事件的三种方法
//第一种方式 Button Btn1 = (Button)findViewById(R.id.button1);//获取按钮资源 Btn1.setOnClickListener(new Button ...
- Android中传递对象的三种方法
Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递. 序列化对象可以使用Ja ...
- Android中保存数据的三种方法
一,Preferences Preferences是一个较轻量级的存储数据的方法,具体使用方法: 在A中保存值: SharedPreferences.Editor sharedata = getSha ...
- android全局计时_Android中使用定时器的三种方法
本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第 ...
- 【在PowerPoint中插入视频的三种方法】
为了能更好地帮助大家合理地在PowerPoint课件中插入和播放视频文件, 在PowerPoint中插入视频的三种方法 ,本文特向大家介绍PowerPoint中插入和处理视频的三种方法. 直接播放视频 ...
- matlab保存所有图,Matlab中图片保存的5种方法
matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的. Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具 ...
- android 画布叠加,Android实现图片叠加效果的两种方法
本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...
最新文章
- Python的with...as的用法
- php里面的log是什么文件夹,用PHP生成自己的LOG文件
- Android传感器-开发指南
- 查数估获近千万元融资 ,用科技为金融赋能
- 现代数字影视 电影使用标准
- NOI数据结构:树套树
- Android Studio下gradle环境搭建
- 加密解密你了解多少?
- 简述线程,程序、进程的基本概念。以及他们之间关系是什么?
- sigmoid函数的求导过程
- re正则表达式7_{}
- python自动检测网站_Web全自动化测试Python + Pytest+Selenium+ Saucelabs 转
- 如何将Android手机用作调制解调器; 无需生根,Redux
- uac2+android,iBasso UAC
- 006-Archer@冯鹤楠 MySQL 打卡作业2
- JIRA消息通知打通钉钉群
- Linux磁盘分区及格式化简介,Linux硬盘分区及格式化学习笔记
- 如何使用Arcgis10.6在影像中画shp继而对影像做出裁剪
- 商业智能助力 银行业数据“挖金”
- Three.js基础之图元
热门文章
- 已解决selenium.common.exceptions.WebDriverException: Messag: ‘geckodriver‘ executable needs to be in PA
- 计算机是如何跑起来的百度云,《程序是怎样跑起来的》(下)
- MinGW与Clion下载安装及使用详解
- 用数组+链表实现哈希表
- 企查查api接口批量操作实战
- Unity 显示FPS
- python小组项目总结报告_给大家汇报一下我们学习小组的进展情况
- 记录一次teamview无法远程连接对方teamview的过程
- 备案需要域名证书吗?如何下载域名证书?
- uniapp对接微信公众号H5微信支付、分享、小程序隐藏右上角分享胶囊