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 ...
随机推荐
- IMP-00058 ORA-12638:身份证明检索失败
需要将oracle的tns关掉 1.打开 oracle 的Net Manage 地址:开始 -> 程序 -> Oracle -> Configuration and Migratio ...
- 设计模式 Singleton 单例 懒汉,线程安全
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
- 使用UDEV SCSI规则在Oracle Linux上配置ASM
对于使用ASM管理的磁盘来说,需要一种能够用于一致性标识磁盘设备及其正确的所属关系和权限的手段.在Linux系统中,可以使用ASMLib来执行这项任务,但是这样做的缺点是在操作系统上增加了额外的一层, ...
- [ USACO 2018 OPEN ] Out of Sorts (Silver)
\(\\\) \(Description\) 运行以下代码对一长为\(N\)的数列\(A\)排序,不保证数列元素互异: cnt = 0 sorted = false while (not sorted ...
- 线性回归的Cost function实现
此处使用Octave来实现 线性方程的代价函数: 代价函数: X 是测试值,假设用矩阵表示为 为了方便用矩阵计算我们把X加一列 1 : 同时 那么h( ...
- service里设置websocket心跳并向fragment发送数据
垃圾小白写了自己看的 /** * service 文件 */ public class SocketService extends Service { //自己定义接口用来传参 private sta ...
- ScrollView在调试状态一点击就挂的原因(OnMouseActivate)
这几天做的一个任务是做一个Dialog,需要在这个Dialog中添加一个自定义的CSrollvew类,但是遇到一个比较扯淡的问题,程序直接运行时可以的,调试状态下一点击CSrollview就挂了.而且 ...
- JS——stye属性
1.样式少的时候使用 this.parentNode.style.backgroundColor="yellow"; 2.style是对象 console.log(box.styl ...
- 如何在Linuxt系统下运行maven项目
如何在Linuxt系统下运行maven项目 我们知道现在利用MAVEN来管理JAVA项目是非常常见的.比如公司一般都有一个自己的MAVEN仓库,通过MAVEN仓库来解决我们的项目依赖,更加方便的构建项 ...
- jQuery怎么去掉标签的hover效果
今天项目中遇到jquery去掉hover效果的问题,开始以为直接unbind(“hover”)就可以搞定,可是实际验证这个方法并没有作用,正确的使用方法应该是下面这样: /* 这种方法是新增的,在老的 ...