http://blog.csdn.net/l448288137/article/details/48276681

最近项目开发中使用到了圆角图片,网上找到的圆角图片控件大多比较死板,只可以全圆角。其中感觉最好的也就是半圆角 链接在这里。想了一下,我自己在这个的基础上进行了一点改进,使得图片可以设置任意角为圆角。

先上效果图:

核心代码

  1. package fillet.sgn.com.filletimage;
  2. import android.graphics.Bitmap;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.PorterDuff;
  7. import android.graphics.PorterDuffXfermode;
  8. import android.graphics.Rect;
  9. import android.graphics.RectF;
  10. /**
  11. * Created by liujinhua on 15/9/7.
  12. */
  13. public class BitmapFillet {
  14. public static final int CORNER_NONE = 0;
  15. public static final int CORNER_TOP_LEFT = 1;
  16. public static final int CORNER_TOP_RIGHT = 1 << 1;
  17. public static final int CORNER_BOTTOM_LEFT = 1 << 2;
  18. public static final int CORNER_BOTTOM_RIGHT = 1 << 3;
  19. public static final int CORNER_ALL = CORNER_TOP_LEFT | CORNER_TOP_RIGHT | CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;
  20. public static final int CORNER_TOP = CORNER_TOP_LEFT | CORNER_TOP_RIGHT;
  21. public static final int CORNER_BOTTOM = CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;
  22. public static final int CORNER_LEFT = CORNER_TOP_LEFT | CORNER_BOTTOM_LEFT;
  23. public static final int CORNER_RIGHT = CORNER_TOP_RIGHT | CORNER_BOTTOM_RIGHT;
  24. public static Bitmap fillet(Bitmap bitmap, int roundPx,int corners) {
  25. try {
  26. // 其原理就是:先建立一个与图片大小相同的透明的Bitmap画板
  27. // 然后在画板上画出一个想要的形状的区域。
  28. // 最后把源图片帖上。
  29. final int width = bitmap.getWidth();
  30. final int height = bitmap.getHeight();
  31. Bitmap paintingBoard = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  32. Canvas canvas = new Canvas(paintingBoard);
  33. canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
  34. final Paint paint = new Paint();
  35. paint.setAntiAlias(true);
  36. paint.setColor(Color.BLACK);
  37. //画出4个圆角
  38. final RectF rectF = new RectF(0, 0, width, height);
  39. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  40. //把不需要的圆角去掉
  41. int notRoundedCorners = corners ^ CORNER_ALL;
  42. if ((notRoundedCorners & CORNER_TOP_LEFT) != 0) {
  43. clipTopLeft(canvas,paint,roundPx,width,height);
  44. }
  45. if ((notRoundedCorners & CORNER_TOP_RIGHT) != 0) {
  46. clipTopRight(canvas, paint, roundPx, width, height);
  47. }
  48. if ((notRoundedCorners & CORNER_BOTTOM_LEFT) != 0) {
  49. clipBottomLeft(canvas,paint,roundPx,width,height);
  50. }
  51. if ((notRoundedCorners & CORNER_BOTTOM_RIGHT) != 0) {
  52. clipBottomRight(canvas, paint, roundPx, width, height);
  53. }
  54. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  55. //帖子图
  56. final Rect src = new Rect(0, 0, width, height);
  57. final Rect dst = src;
  58. canvas.drawBitmap(bitmap, src, dst, paint);
  59. return paintingBoard;
  60. } catch (Exception exp) {
  61. return bitmap;
  62. }
  63. }
  64. private static void clipTopLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {
  65. final Rect block = new Rect(0, 0, offset, offset);
  66. canvas.drawRect(block, paint);
  67. }
  68. private static void clipTopRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {
  69. final Rect block = new Rect(width - offset, 0, width, offset);
  70. canvas.drawRect(block, paint);
  71. }
  72. private static void clipBottomLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {
  73. final Rect block = new Rect(0, height - offset, offset, height);
  74. canvas.drawRect(block, paint);
  75. }
  76. private static void clipBottomRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {
  77. final Rect block = new Rect(width - offset, height - offset, width, height);
  78. canvas.drawRect(block, paint);
  79. }
  80. }

android中对Bitmap图片设置任意角为圆角的更多相关文章

  1. android中保存Bitmap图片到指定文件夹中的方法

    /** 保存方法 */  public void saveBitmap() {   Log.e(TAG, "保存图片");   File f = new File("/s ...

  2. android中使用Nine-Patch图片

    android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...

  3. 【原创】如何在Android中为TextView动态设置drawableLeft等

    如何在Android中为TextView动态设置drawableLeft等   两种方式:   方式1:手动设置固有边界 Drawable drawable = getResources().getD ...

  4. 四十六、android中的Bitmap

    四十六.android中的Bitmap: http://www.cnblogs.com/linjiqin/archive/2011/12/28/2304940.html 四十七.实现调用Android ...

  5. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果

     Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...

  6. android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题

    bitmap的平铺.镜像drawable文件夹中新建bitmap,其中的tileMode属性 tileMode 属性就是用于定义背景的显示模式:  disabled  默认值,表示不使用平铺  cla ...

  7. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  8. Android中设定背景图片平铺。

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在做Android开发时,我们常常需要为程序设定一个背景,但由于现在的Android设备尺寸不一,如果随便设置一个图片为背景,那么很 ...

  9. android中获取 bitmap 像素的颜色 之吸管取色功能

    本功能是参考android API colorPickerView修改,实现类似与PS中吸管取色功能.也就是可以对图片的任意位置取该位置的RGB.本demo中,完成了色盘取色功能.当点击色盘的某个位置 ...

随机推荐

  1. teyi

    $arr=array('haha'=>"苹果");print_r($arr['haha']); $arr=array(0=>"苹果");$arr=a ...

  2. linux内核之链表操作解析

    本文只是对linux内核中的链表进行分析.内核版本是linux-2.6.32.63.文件在:linux内核/linux-2.6.32.63/include/linux/list.h.本文对list.h ...

  3. mysql随记

    .frm是描述了表的结构,.MYD保存了表的数据记录,*.MYI则是表的索引 ibd是MySQL数据文件.索引文件,无法直接读取. ibdata是innodb引擎使用的 如果是使用myisam引擎 则 ...

  4. bone collector hdu 01背包问题

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  5. Delphi关键词

    学习的东西越来越多难免会忘记以前的知识,即使是你的大脑很发达也不见得能记得所有的东西,单词,所以做做笔记写写小抄是一个很好的习惯,到需要的时候来翻翻看看,当然个人的作小抄的习惯也不尽相同,这里我自己做 ...

  6. FileReader和FileInputStream的区别

    1.FileReader和FileInputStream的区别: FileReader.FileWriter处理的是文本文件. FileInputStream/FileOutputStream是继承I ...

  7. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  8. spring可以get到bean,注入却为空

    使用spring的时候,已经将要用的bean注入到容器之中却发现在程序中总是报null,后来发现是因为当前的启动类没有在容器之中,所以用上下文可以get到,但是注入却无效

  9. NSCondition用法

    NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...

  10. 没事抽空学——c语言指针操作基础概念

    指针基础 理解指针的最佳方法是画图,学习使用基本指针,不要产生空指针. 存储控件分配 存储控件分配是指在内存预留空间的过程.就像一个虚拟菜谱一样,指针对应菜名,其所指的内存空间中的数据对应实际的菜. ...