Android 绘制圆形图片
经常在项目中,会遇到使用圆形头像。
然而图片往往不是圆形的,我们须要对图片进行处理。以达到圆形图片的效果。这里。我总结了一下经常使用的android圆形图片的绘制的方法。
主要有以下几种方式:1.画布裁剪;2.Xfermode进行重叠。3使用着色器shader。
以下我们将一个一个进行描写叙述:
第一种,画布裁剪:通过创建空白的Bitmap生成canvas画布,然后将画布进行裁剪成圆形,最后在画布上进行绘制。见代码:
/**
* 通过裁剪画布
*
* @param bitmap
* @return
*/
public static Bitmap clipDrawable(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int min = Math.min(width, height); //通过新建一个Bitmap创建一个画布
Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bp); Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
//创建圆形路径,用于画布裁剪
Path path = new Path();
path.addCircle(min / 2, min / 2, min / 2, Path.Direction.CCW);
canvas.clipPath(path);
//在裁剪后的画布上进行绘制
canvas.drawBitmap(bitmap, -width / 2 + min / 2, -height / 2 + min / 2, paint);
return bp;
}
另外一种。Xfermode:我们使用Xfermode的src_in模式,将原始图片和圆形进行重叠,得到重叠的圆形部分。
/**
* 通过Xfermode
*
* @param bitmap
* @return
*/
public static Bitmap getCircleBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int min = Math.min(width, height); //通过新建一个Bitmap创建一个画布
Bitmap bp = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GRAY);
Canvas canvas = new Canvas(bp);
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
//设置模式为取重叠的部分
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
// paint.setColorFilter(new LightingColorFilter(0xFFFFFF00, 0x00000000));
// canvas.drawBitmap(bitmap, min / 2 - width / 2, min / 2 - height / 2, paint);
canvas.drawBitmap(bitmap, null, new Rect(min / 2 - width / 2, min / 2 - height / 2, width / 2 + min / 2, height / 2 + min / 2), paint);
return bp;
}
第三种,shader着色器:给画笔设置着色器,最后使用这个画笔绘制圆形。
/**
* 通过shader
*/ public static Bitmap getShaderBitmap(Bitmap bitmap) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GRAY);
//设置着色器
paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); int width = bitmap.getWidth();
int height = bitmap.getHeight();
int r = Math.min(width, height) / 2;
Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bp);
//在圆形中进行着色
canvas.drawCircle(width/2, height/2, r, paint);
return bp;
}
整体来说,绘制的方法大致如上所述。大家能够针对自己的需求进行改动。
上面的代码写的demo,所以命名方面比較任意,请大家谅解。假设有什么错误的地方,请大家指正,不甚感激。
Android 绘制圆形图片的更多相关文章
- android绘制圆形图片的两种方式
看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...
- Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现
Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...
- Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...
- Android实现圆形图片
情景再现: 写Android程序也有一段时间了,今天突然被问怎么实现一个圆形图片,很多app图像是圆形的.但是用户上传的图像可不是圆的,所以问题就来了,需要我们代码实现圆形图片.但是大脑飞转想到第三 ...
- Android 自定义圆形图片 CircleImageView
1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...
- Android自定义圆形图片工具类(CTRL+C加CTRL+V直接使用)
先贴一下工具类的代码!可直接复制粘贴 public class RoundImageView extends ImageView { private Paint mPaint; //画笔 privat ...
- Android程序设计-圆形图片的实现
在android中,google只提供了对图形的圆形操作,而没有实现对图片的圆形操作,所以我们无法实现上述操作,在此我们将使用框架进行设计(下述框架为as编写): https://github.com ...
- android自定义圆形图片和遇到的问题
画圆遇到的问题:图片单位不一样,导致图片只能显示出圆的一部分:看代码: public class MyCircleIamge extends ImageView { private Context c ...
- Android实现圆形圆角图片
本文主要使用两种方法实现图形圆角图片 自定View加上使用Xfermode实现 Shader实现 自定View加上使用Xfermode实现 /** * 根据原图和变长绘制圆形图片 * * @param ...
随机推荐
- Swift自适应布局(Adaptive Layout)教程
通用的Storyboard 通用的stroyboard文件是通向自适应布局光明大道的第一步.在一个storyboard文件中适配iPad和iPhone的布局在iOS8中已不再是梦想.我们不必再为不同尺 ...
- Redis 的简单运算
Redis 的简单运算 命令 说明 备注 incr key 在原字段上加 1 只能对整数操作 incrby key increment 在原字段上加上整数 (increment) 只能对整数操作 de ...
- fcc html5 css 练习3
行内样式看起来是这样的 <h1 style="color: green"> .pink-text { color: pink !important; } ...
- JS——拖拽盒子
注意事项: 1.opacity是全部元素变透明,rgba只是背景色变透明 2.先是注册鼠标按下的事件,此时就需要记录鼠标在盒子中的坐标 3.再在鼠标按下事件中注册鼠标移动事件,此时鼠标的坐标是不断变化 ...
- JAVA和JVM运行原理揭秘
这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器 ...
- async await 同步方法调用异步方法死锁
同步方法调用异步方法.GetAwaiter().GetResult()计算函数超时,异步方法所有的回调操作都会期望返回到主线程. 所以会导致各种线程死锁.异步方法中使用ConfigureAwait(f ...
- post发送数据 mypost input 改变事件
//name=或者 "&name=" + "123" + "&data=" + "slice" (可以获 ...
- anguar相关
1.创建组件 在某目录下创建组件 ng g c content/membersManage 2.创建服务 在某目录下创建服务 ng g service services/storage 2.创建模 ...
- Fedora 和 RedHat 以及 SUSE 中 YUM 工具的使用
参考博客:https://www.cnblogs.com/good-study/p/9928587.html 一.yum命令概述: 1.简介: yum命令时在Fedora和RedHat以及SUSE中基 ...
- 实现动画之CSS与JavaScript对比
曾经某个时期,大多数开发者使用 jQuery 给浏览器中的元素添加动画.让这个淡化,让那个扩大,很简单.随着互动的项目越来越复杂,移动设备的大量增加,表现性能变得越来越重要.Flash 被抛弃,有天赋 ...