转自http://blog.csdn.net/silangquan/article/details/8056583

圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子:

下面在Android中实现将普通的矩形图片绘制成圆角矩形。首先看最终效果:

代码清单:
[java] view plaincopy
  1. package com.example.phototest;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.Path;
  10. import android.graphics.PorterDuffXfermode;
  11. import android.graphics.PorterDuff;
  12. import android.graphics.RectF;
  13. import android.graphics.drawable.BitmapDrawable;
  14. import android.graphics.drawable.Drawable;
  15. import android.view.Menu;
  16. import android.widget.ImageView;
  17. public class MainActivity extends Activity {
  18. private ImageView myImageView;
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. myImageView=(ImageView)findViewById(R.id.imageView1);
  24. Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.photo1);
  25. myImageView.setImageBitmap(createFramedPhoto(500,400,photo,20));
  26. //myImageView.setImageBitmap(createStarPhoto(500,400,photo));
  27. }
  28. @Override
  29. public boolean onCreateOptionsMenu(Menu menu) {
  30. getMenuInflater().inflate(R.menu.activity_main, menu);
  31. return true;
  32. }
  33. private Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
  34. //根据源文件新建一个darwable对象
  35. Drawable imageDrawable = new BitmapDrawable(image);
  36. // 新建一个新的输出图片
  37. Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
  38. Canvas canvas = new Canvas(output);
  39. // 新建一个矩形
  40. RectF outerRect = new RectF(0, 0, x, y);
  41. // 产生一个红色的圆角矩形
  42. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  43. paint.setColor(Color.RED);
  44. canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);
  45. // 将源图片绘制到这个圆角矩形上
  46. //详解见http://lipeng88213.iteye.com/blog/1189452
  47. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  48. imageDrawable.setBounds(0, 0, x, y);
  49. canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
  50. imageDrawable.draw(canvas);
  51. canvas.restore();
  52. return output;
  53. }
  54. }

实现原理:通过在一个Canvas中绘制一个最终的输出形状,然后通过类似于遮罩的方式将图形显示出来,最终的图片形状就是先前绘制的图形的形状。具体起作用的函数是这个:

[java] view plaincopy
  1. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
用来设置叠加模式的。
通过这个原理,我能就能够绘制各种各样形状的图片,比如:

代码:

[java] view plaincopy
  1. private Bitmap createStarPhoto(int x, int y, Bitmap image)
  2. {
  3. //根据源文件新建一个darwable对象
  4. Drawable imageDrawable = new BitmapDrawable(image);
  5. // 新建一个新的输出图片
  6. Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
  7. Canvas canvas = new Canvas(output);
  8. // 新建一个矩形
  9. RectF outerRect = new RectF(0, 0, x, y);
  10. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  11. paint.setColor(Color.RED);
  12. Path path = new Path();
  13. //绘制三角形
  14. //path.moveTo(0, 0);
  15. //path.lineTo(320, 250);
  16. //path.lineTo(400, 0);
  17. //绘制正无边形
  18. long tmpX,tmpY;
  19. path.moveTo(200, 200);// 此点为多边形的起点
  20. for(int i=0;i<=5;i++)
  21. {
  22. tmpX =(long)(200+200*Math.sin((i*72+36)*2*Math.PI/360));
  23. tmpY =(long)(200+200*Math.cos((i*72+36)*2*Math.PI/360));
  24. path.lineTo(tmpX, tmpY);
  25. }
  26. path.close(); // 使这些点构成封闭的多边形
  27. canvas.drawPath(path, paint);
  28. //canvas.drawCircle(100, 100, 100, paint);
  29. // 将源图片绘制到这个圆角矩形上
  30. // 产生一个红色的圆角矩形
  31. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  32. imageDrawable.setBounds(0, 0, x, y);
  33. canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
  34. imageDrawable.draw(canvas);
  35. canvas.restore();
  36. return output;
  37. }

Android中绘制圆角矩形图片及任意形状图片相关推荐

  1. 在Android中绘制圆角矩形图片

    圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,下面在Android中实现将普通的矩形图片绘制成圆角矩形.        先来看一下普通矩形图片的显示,代码很简单,从r ...

  2. 在Canvas中绘制圆角矩形

    问题的提出 要在Canvas中绘制一个矩形,使用strokeRect或fillRect函数即可. var canvas = document.getElementById("canvas&q ...

  3. android paint 圆角 绘制_[BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  4. Delphi中绘制圆角矩形的窗体

    制作圆角矩形的窗体: 01.procedure TPortForm.FormCreate(Sender: Tobject); 02.var hr :thandle; 03.begin 04.hr:=c ...

  5. HTML设置单边圆角,如何在html中做圆角矩形和 只有右边的分隔线

    其实是对(理论上是对所有的)html元素: 而实际 常用的是 div块, 链接a 等运用圆角矩形的样式 这个圆角是通过元素: div, a的 css 样式来实现的: 样式: border-radius ...

  6. android中图片圆角,Android中实现圆角图片的几种方法

    Android中实现圆角图片有多种姿势,不知你解锁了几种? 方法一:setXfermode法 此种方式就是再new一个相同尺寸的bitmap,然后使用paint.setXfermode(new Por ...

  7. android绘制圆角矩形

    android中可以绘制圆角矩形. 1.利用画布cavas绘制 如果提供了一个方法可以在画布上绘制圆角矩形: 函数名称:public void drawRoundRect (RectF rect, f ...

  8. 微信小程序使用canvas绘制圆角矩形在Android:变形、锯齿

    这两天用小程序实现分享生成海报,那我的手机测的一直没问题,结果后来用同事的小米测发现:画的图形缺个角,锯齿形的,根据小程序社区回复:使用ctx.arc + ctx.lineTo就能避免Android错 ...

  9. html中圆角矩形怎么写,如何在HTML画布上绘制圆角矩形?

    要在HTML中绘制矩形,请使用canvas元素.对于画布,请使用该rect()方法绘制矩形.但是,对于创建圆角矩形,使用该rect()方法将不起作用.我们将使用lineTo()andquadratic ...

最新文章

  1. 图文并茂!60页PPT《快速入门python数据分析路线》(附链接)
  2. 【原创】iframe与父页面之间,变量、方法互相调用
  3. [JS]js中判断变量类型函数typeof的用法汇总[转]
  4. 图文+动画讲解排序算法总结!!
  5. 给刚入行的存储工程师10+1点建议
  6. 【Pytorch】interpolate==>上下采样函数
  7. Oracle DataGuard数据备份方案详解
  8. MyBatis的CRUD操作
  9. 异常处理和代码复用在python自动化运维中的使用(eNSP模拟器)
  10. 【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
  11. 你有必要不沾计算机一段时间英语,2014新人教版八年级英语下册第一单元必背词组及句子...
  12. 将虚幻引擎5与Perforce Helix Core集成使用吧!
  13. GNSS/INS组合导航(五):惯性导航参数建模
  14. 利用“3 of 9 barcode”字体实现一维条形码(只支持英文等ASCII字符)
  15. 微生物组-宏基因组分析(线上/线下同时开课,2021.11)
  16. 抖音企业号,抖音搜索框SEO优化系统搭建。
  17. Failed to open \EFI\BOOT\mmx64.efi问题解决
  18. 北航计算机是啥水平,清华眼中的北航是什么水平?附北航2020年全国录取分数线...
  19. 机器学习准备数据时如何避免数据泄漏
  20. Highcharts Gantt JS 现代 Web 开发的甘特图

热门文章

  1. Windows下JPBC库的使用
  2. Codeforces Round #521 (Div. 3) B. Disturbed People
  3. 清华毕业程序员国企干了14年,去应聘小公司,看到工资后愣了
  4. C++ Tetris俄罗斯方块
  5. 重心法选址 matlab程序,Excel重心法选址计算题的详细步骤
  6. Ubuntu下搭建SVN与Apache权限控制
  7. Unity3d在PC上竖屏运行
  8. win10 无法识别x64dbg 插件
  9. c#控制台模拟dos_超好用的C#控制台应用模板
  10. 关于使用winfrom程序调用命令控制台