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

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

代码清单:

  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中绘制一个最终的输出形状,然后通过类似于遮罩的方式将图形显示出来,最终的图片形状就是先前绘制的图形的形状。具体起作用的函数是这个:

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

用来设置叠加模式的。

通过这个原理,我能就能够绘制各种各样形状的图片,比如:

代码:

  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. 在Microsoft Expression Blend 2 中绘制圆角矩形按钮

    原文:在Microsoft Expression Blend 2 中绘制圆角矩形按钮 /* 声明:转载请保留此信息:http://www.BrawDraw.com, http://www.ZPXP.c ...

  2. [BOT] 一种android中实现“圆角矩形”的方法

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

  3. Android中实现圆角矩形及半透明效果。

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在做Android开发时,我们为了美观,有时候需要使用圆角矩形,或半透明之类的效果,在网页设计中很容易实现.但在Android开发中 ...

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

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

  5. Android 自定义的圆角矩形ImageView 工具类

    上图看效果 自定义圆角矩形ImageView工具类 package com.wechaotou.utils; import android.content.Context; import androi ...

  6. 如何在html中做圆角矩形和 只有右边的"分隔线"

    这个网站满好的,可以常看看 css-matic中有几个很好的写css可视化的工具 其实做css 版式布局等都可以有工具的 推荐40个优秀的免费CSS工具 debugger正则表达式在线 其实是对(理论 ...

  7. CODESOFT中的圆角矩形的弧度该怎样设置?

      CODESOFT标签设计软件提供多种图形制作按钮,方便用户更为快捷的制作标签.其中就包括矩形,圆角矩形的快捷创建按钮.本文将介绍如何设置CODESOFT圆角矩形的弧度. 若有疑问可直接访问:htt ...

  8. canva绘制圆角矩形

    在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> < ...

  9. 解读Unity中的CG编写Shader系列四(unity中的圆角矩形shader)

    转自 http://www.itnose.net/detail/6097625.html 上篇文章中我们掌握了表面剔除和剪裁模式 这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做 ...

随机推荐

  1. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  2. 流媒体开发之--HLS--M3U8解析(2): HLS草案

    目录 1 简介 2 2 概述 2 3 播放列表文件 3 3.1 介绍 3 3.2新标签 4 3.2.1 EXT-X-TARGETDURATION 4 3.2.2 EXT-X-MEDIA-SEQUENC ...

  3. JavaScript类的设计

    [转载] Javascript与其他的面向对象语言不同,如C++,Java或PHP等.它并不是基于类的,而是基于原型的一种语言. 1.对象创建 在Javascript中创建一个类是非常容易的: var ...

  4. Mac下Apache服务器配置

    一.Apache服务器 1. 使用最广的 Web 服务器 2. Mac自带,只需要修改几个配置就可以,简单,快捷 3. 有些特殊的服务器功能,Apache都能很好的支持 目的:让有一个自己专属的测试环 ...

  5. oracle函数trunc的使用

    1.日期比较时精确到日,可以使用 TRUNC(sysdate,'dd')函数.函数支持格式有:yyyy MM  dd  hh Mi可以用   select TRUNC(sysdate,'yyyy') ...

  6. C++输入和输出

    本文转载:blog.csdn.net/zhanghaotian2011/article/details/8868577博客 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出 ...

  7. 开发网站相关知识html和javascript

    1.html 布局 https://github.com/bramstein/jlayout/ http://welcome.totheinter.net/columnizer-jquery-plug ...

  8. (原)STL中vector的疑问

    以前基本上没有用过STL,当然包括里面的vector.今天试验了一下. 主要看了这个网址: http://blog.csdn.net/phoebin/article/details/3864590 代 ...

  9. 为什么所有浏览器的userAgent都带Mozilla

    参看下面链接:<为什么所有的浏览器的userAgent都带Mozilla>

  10. Java IO 和 NIO

    昨天面试问到了有关Java NIO的问题,没有答上来.于是,在网上看到了一篇很有用的系列文章讲Java IO的,浅显易懂.后面的备注里有该系列文章的链接.内容不算很长,需要两个小时肯定看完了,将该系列 ...