经常在项目中,会遇到使用圆形头像。

然而图片往往不是圆形的,我们须要对图片进行处理。以达到圆形图片的效果。这里。我总结了一下经常使用的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 绘制圆形图片的更多相关文章

  1. android绘制圆形图片的两种方式

    看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...

  2. Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现

     Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...

  3. Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框

     Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...

  4. Android实现圆形图片

     情景再现: 写Android程序也有一段时间了,今天突然被问怎么实现一个圆形图片,很多app图像是圆形的.但是用户上传的图像可不是圆的,所以问题就来了,需要我们代码实现圆形图片.但是大脑飞转想到第三 ...

  5. Android 自定义圆形图片 CircleImageView

    1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...

  6. Android自定义圆形图片工具类(CTRL+C加CTRL+V直接使用)

    先贴一下工具类的代码!可直接复制粘贴 public class RoundImageView extends ImageView { private Paint mPaint; //画笔 privat ...

  7. Android程序设计-圆形图片的实现

    在android中,google只提供了对图形的圆形操作,而没有实现对图片的圆形操作,所以我们无法实现上述操作,在此我们将使用框架进行设计(下述框架为as编写): https://github.com ...

  8. android自定义圆形图片和遇到的问题

    画圆遇到的问题:图片单位不一样,导致图片只能显示出圆的一部分:看代码: public class MyCircleIamge extends ImageView { private Context c ...

  9. Android实现圆形圆角图片

    本文主要使用两种方法实现图形圆角图片 自定View加上使用Xfermode实现 Shader实现 自定View加上使用Xfermode实现 /** * 根据原图和变长绘制圆形图片 * * @param ...

随机推荐

  1. nginx入门学习

    1.yum解决编译nginx所需的依赖包,之后你的nginx就不会报错了 yum install gcc patch libffi-devel python-devel zlib-devel bzip ...

  2. Elasticsearch之sense插件的安装(图文详解)

    sense插件可以方便的执行rest请求,但是中文输入的体验不是很好. 安装sense只需要在Kibana端安装插件即可,插件会自动安装到kibana的应用菜单中. [hadoop@master ki ...

  3. Hadoop Hive概念学习系列之hive与依赖环境的交互(二十一)

    hive与环境的交互,算是一个小知识点,但掌握不菲! 如何在hive里,也达到这样呢? 不需要这样啦,因为,hive是建立在hadoop之上,启动hive,相当于,就是,hadoop jar ** h ...

  4. springboot自定义常量配置

    现在你建一个类: import org.springframework.boot.context.properties.ConfigurationProperties; /** * Created b ...

  5. [转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)

    本文转自:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj150597.aspx 本主题将展示在使用 StreamSocket 功能时,如 ...

  6. vb.net实现textbox控件输入指定位数小数方法实现。

    Private Sub textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPres ...

  7. P1968 美元汇率

    题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...

  8. Win32基础知识整理

    1.定义字符串 在资源新建String table,增加新字符串: (win32加载) TCHAR tcIDName[255]=_T(""); LoadString(hInstan ...

  9. 怎么搭建Hibernate对象持久化框架?

    DBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写访问数据库的程序代码.其中常用的接口和类包括下面内容: Dri ...

  10. dubbo之配置规则

    配置规则 向注册中心写入动态配置覆盖规则 1.该功能通常由监控中心或治理中心的页面完成. RegistryFactory registryFactory = ExtensionLoader.getEx ...