公司的项目,UI和应用都是我自己做的。前几天设计了一个UI,出现了半边圆角的情况,如下图片所示。图片都来自服务器,肯定不能要求返回的图片按这个格式,必须在应用端对图片进行切角。

Google了好久,发现能找到的代码都是重复的,而且代码垃圾很多。于是按着那段代码的解决方式,自己写了一个实现指定切某一边的工具类。

直接可用的代码:

  1. package com.lurencun.androidsysteminfomation;
  2. import android.graphics.Bitmap;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.PorterDuffXfermode;
  7. import android.graphics.Rect;
  8. import android.graphics.RectF;
  9. import android.graphics.Bitmap.Config;
  10. import android.graphics.PorterDuff.Mode;
  11. /**
  12. * @author : 桥下一粒砂
  13. * @email  : chenyoca@gmail.com
  14. * @date   : 2012-11-8
  15. * @desc   :
  16. */
  17. public class BitmapFillet {
  18. public static final int ALL = 347120;
  19. public static final int TOP = 547120;
  20. public static final int LEFT = 647120;
  21. public static final int RIGHT = 747120;
  22. public static final int BOTTOM = 847120;
  23. /**
  24. *
  25. * 指定图片的切边,对图片进行圆角处理
  26. * @param type 具体参见:{@link BitmapFillet.ALL} , {@link BitmapFillet.TOP} ,
  27. *              {@link BitmapFillet.LEFT} , {@link BitmapFillet.RIGHT} , {@link BitmapFillet.BOTTOM}
  28. * @param bitmap 需要被切圆角的图片
  29. * @param roundPx 要切的像素大小
  30. * @return
  31. *
  32. */
  33. public static Bitmap fillet(int type,Bitmap bitmap,int roundPx) {
  34. try {
  35. // 其原理就是:先建立一个与图片大小相同的透明的Bitmap画板
  36. // 然后在画板上画出一个想要的形状的区域。
  37. // 最后把源图片帖上。
  38. final int width = bitmap.getWidth();
  39. final int height = bitmap.getHeight();
  40. Bitmap paintingBoard = Bitmap.createBitmap(width,height, Config.ARGB_8888);
  41. Canvas canvas = new Canvas(paintingBoard);
  42. canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
  43. final Paint paint = new Paint();
  44. paint.setAntiAlias(true);
  45. paint.setColor(Color.BLACK);
  46. if( TOP == type ){
  47. clipTop(canvas,paint,roundPx,width,height);
  48. }else if( LEFT == type ){
  49. clipLeft(canvas,paint,roundPx,width,height);
  50. }else if( RIGHT == type ){
  51. clipRight(canvas,paint,roundPx,width,height);
  52. }else if( BOTTOM == type ){
  53. clipBottom(canvas,paint,roundPx,width,height);
  54. }else{
  55. clipAll(canvas,paint,roundPx,width,height);
  56. }
  57. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  58. //帖子图
  59. final Rect src = new Rect(0, 0, width, height);
  60. final Rect dst = src;
  61. canvas.drawBitmap(bitmap, src, dst, paint);
  62. return paintingBoard;
  63. } catch (Exception exp) {
  64. return bitmap;
  65. }
  66. }
  67. private static void clipLeft(final Canvas canvas,final Paint paint,int offset,int width,int height){
  68. final Rect block = new Rect(offset,0,width,height);
  69. canvas.drawRect(block, paint);
  70. final RectF rectF = new RectF(0, 0, offset * 2 , height);
  71. canvas.drawRoundRect(rectF, offset, offset, paint);
  72. }
  73. private static void clipRight(final Canvas canvas,final Paint paint,int offset,int width,int height){
  74. final Rect block = new Rect(0, 0, width-offset, height);
  75. canvas.drawRect(block, paint);
  76. final RectF rectF = new RectF(width - offset * 2, 0, width , height);
  77. canvas.drawRoundRect(rectF, offset, offset, paint);
  78. }
  79. private static void clipTop(final Canvas canvas,final Paint paint,int offset,int width,int height){
  80. final Rect block = new Rect(0, offset, width, height);
  81. canvas.drawRect(block, paint);
  82. final RectF rectF = new RectF(0, 0, width , offset * 2);
  83. canvas.drawRoundRect(rectF, offset, offset, paint);
  84. }
  85. private static void clipBottom(final Canvas canvas,final Paint paint,int offset,int width,int height){
  86. final Rect block = new Rect(0, 0, width, height - offset);
  87. canvas.drawRect(block, paint);
  88. final RectF rectF = new RectF(0, height - offset * 2 , width , height);
  89. canvas.drawRoundRect(rectF, offset, offset, paint);
  90. }
  91. private static void clipAll(final Canvas canvas,final Paint paint,int offset,int width,int height){
  92. final RectF rectF = new RectF(0, 0, width , height);
  93. canvas.drawRoundRect(rectF, offset, offset, paint);
  94. }
  95. }

【Android】图片切角,切指定的边。的更多相关文章

  1. Android屏幕适配与切图_汇总

    首先和最后,还是先看好官方文档:http://developer.android.com/guide/practices/screens_support.html 对应的翻译blog有牛人做了:And ...

  2. Css-深入学习之弧形切角矩形

    本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 (弧形切角矩形) 代码: width: 180px; heig ...

  3. Css--深入学习之切角

    本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 带切角的矩形: 该图来源于(奇思妙想) Css代码: .not ...

  4. 解决iOS中 tabBarItem设置图片(image+title切图在一起)时造成的图片向上偏移

    解决iOS中 tabBarItem设置图片(image+title切图在一起)时造成的图片向上偏移 解决办法1:设置tabBarItem的imageInsets属性 代码示例: childContro ...

  5. css实现切角效果

    1. 一个切角 思路:如果我们要得到有一个切角的元素,我们只需要使用一个径向渐变就可以达到这个目标,这个渐变需要把一个透明色标放在切角处,然后再相同的位置设置另一个色标,并且把它的颜色设置成我们想要的 ...

  6. CSS奇思妙想图形(心形、气泡三角形、切角、梯形、饼图等)

    今天看到一篇不错文章,在原来CSS3图形创建基础上扩展了很多. 这里记录总结下 心形 原理:利用 圆形 和 正方形实现 HTML: <div class="heartShaped&qu ...

  7. DDGScreenShot--iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法

    写在前面 我们肯定做过这样的需求,给一个图片切圆角, 当然我们大多采用简单粗暴的方法 myIcon.layer.cornerRadius = 16.5 myIcon.layer.masksToBoun ...

  8. css 折角效果/切角效果

    首先我们先创建一个图案为100像素的斜面切角的图案 html <div class="one">12345</div> css .one{ width: 1 ...

  9. Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

    本篇将是我们这个Glide系列的最后一篇文章. 其实在写这个系列第一篇文章的时候,Glide就推出4.0.0的RC版了.那个时候因为我一直研究的都是Glide 3.7.0版本,再加上RC版本还不太稳定 ...

随机推荐

  1. 15款不容错过的前端开发Javascript和css类库 - 2017版本~

    前端的JS和CSS类库日新月异, 在今天这篇介绍中,我们将精挑细选15款超棒的JS/CSS类库, 希望大家在开发过程中会觉得有帮助~ Core UI 基于Bootstrap4的一套UI类库, Core ...

  2. javascript数组去重复

    数组去重 知乎上看到有人去腾讯面试,然后发了面试的js题目,有一个是数组去重 我的土办法 var arr = ['a', 'g', 'q', 'd', 'a', 'e', 'q']; console. ...

  3. SLF4J warning or error messages and their meanings

    来自:http://www.slf4j.org/codes.html#StaticLoggerBinder The method o.a.commons.logging.impl.SLF4FLogFa ...

  4. 创建Python程序

    1. 创建Python程序 欢迎来到Python世界! 本系列文章告诉你怎么样编写Python程序.Python仅仅是一种文本文件.跟普通文本文件是一样的,仅仅只是这样的文本文件不但能够看,还能够在P ...

  5. hibernate和struts实现分页

    仓促把功能进行实现一下  类与类之间也没有进行MVC式分开  重要的是逻辑 记录一下 希望其中的些许代码逻辑对你有用 TUserDaoImpl---dao层的实现 package com.pers.h ...

  6. Atlas系列一:【已解决】error while loading shared libraries: libcrypto.so.6: cannot open shared object file: No such file or directory

    1:Atlas的安装 https://github.com/Qihoo360/Atlas/wiki/Atlas的安装 2: [root@localhost bin]# ./mysql-proxyd t ...

  7. MongoDB分片配置系列一:

    接这篇博客: http://www.cnblogs.com/xiaoit/p/4479066.html 这里不再说明安装过程. 1:分片简介 分片是一种将海量的数据水平扩展的数据库集群系统,数据分表存 ...

  8. iframe 与 frame 区别

    1.iframe iframe主要来内联一个外联的页面,如: <!DOCTYPE html> <html lang="zh"> <head> & ...

  9. Android——自定义多击事件

    一:使用场景 Android本身内置了点击.双击事件,但是某些时候,我们可能需要多击事件. 例如:某个秘密入口,为了避免用户误操作点击.双击到了触发开关而进入到不该被用户看到的页面,我们可以为入口控件 ...

  10. Android学习笔记十:异步处理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7520700.html 一:基础概念 UI线程:当Android程序第一次启动时,Android会同时启动一条主 ...