转自:http://wpf814533631.iteye.com/blog/1847661

(转)【Android】Paint的效果研究

博客分类:

 

在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下。

方法一:

1 //设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
2 setARGB(int a,int r,int g,int b);

这个不多说了,还有两个类似的方法,将设置alpha和rgb分割开来了。注意的是这里的a值是0~255的范围,不是小数。

方法二:

//设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
setAntiAlias(boolean aa);

也不多说,你可以试验一下效果,设置后会平滑一些;

方法三:

1 //设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
2 setDither(boolean dither);

方法四:

1 //设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等
2 setMaskFilter(MaskFilter maskfilter);

MaskFilter类可以为Paint分配边缘效果。
对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter:
BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。
EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。
要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象。下面的例子是对一个已经存在的Paint应用一个EmbossMaskFilter:

 1 // 设置光源的方向
2 float[] direction = new float[]{ 1, 1, 1 };
3
4 //设置环境光亮度
5 float light = 0.4f;
6
7 // 选择要应用的反射等级
8 float specular = 6;
9
10 // 向mask应用一定级别的模糊
11 float blur = 3.5f;
12
13 EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
14
15 // 应用mask
16 myPaint.setMaskFilter(emboss);

可以看一下下面的图,是不是有浮雕的效果??

再看下面使用BlurMaskFilter:

1 //前面一个控制阴影的宽度,后面一个参数控制阴影效果
2 maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);

是不是有阴影效果呢??

方法五:

1 //设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
2 setColorFilter(ColorFilter colorfilter);

这个方法也值得试验一下:

MaskFilter是对一个Paint的alpha通道的转换,而ColorFilter则是对每一个RGB通道应用转换。所有由ColorFilter所派生的类在执行它们的转换时,都会忽略alpha通道。

这个貌似比较麻烦,改天再说。

方法六:

1 //设置绘制路径的效果,如点画线等
2 setPathEffect(PathEffect effect);

又是一个很好玩的方法:

到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect是用来控制绘制轮廓(线条)的方式。PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。
使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括:
1)CornerPathEffect  可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。

2)DashPathEffect  可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。

3) DiscretePathEffect  与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。

4)PathDashPathEffect  这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。
下面的效果可以在一个Paint中组合使用多个Path Effect。
1)SumPathEffect  顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。
2)ComposePathEffect  将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。
对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。
使用setPathEffect方法可以把PathEffect应用到Paint对象中,如下所示:

1 paint.setPathEffect(new CornerPathEffect(10));

其他效果懒得测试了,这个在模拟器上跑的时候效果也不明显,但是真机上跑的时候的确圆滑了许多,看上去很舒服

方法七:

1 //设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
2 setXfermode(Xfermode xfermode);

橡皮擦,这是个好方法啊,看看。

可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。
在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。下面的Xfermode子类可以改变这种行为:
1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
要应用转换模式,可以使用setXferMode方法,如下所示:

1 AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);
2 borderPen.setXfermode(avoid);

这里可以实现完美的橡皮擦功能!代码异常简单:

1 Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
2 paint.setXfermode(xFermode);

这是使用的最后一个子类,关于16条Porter-Duff规则,如下:

 1 private static final Xfermode[] sModes = {
2 new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
3 new PorterDuffXfermode(PorterDuff.Mode.SRC),
4 new PorterDuffXfermode(PorterDuff.Mode.DST),
5 new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
6 new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
7 new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
8 new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
9 new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
10 new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
11 new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
12 new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
13 new PorterDuffXfermode(PorterDuff.Mode.XOR),
14 new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
15 new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
16 new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
17 new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
18 };

它们每个显示的效果具体如下:

第一个就是Clear效果!

上面很多的图都是由SDK APIDemos运行所得~~有时间仔细研究一下Graphics中的每个Activity。

  1. /**
  2. * Paint类介绍
  3. *
  4. * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,
  5. * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,
  6. * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。
  7. *
  8. * 1.图形绘制
  9. * setARGB(int a,int r,int g,int b);
  10. * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
  11. *
  12. * setAlpha(int a);
  13. * 设置绘制图形的透明度。
  14. *
  15. * setColor(int color);
  16. * 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。
  17. *
  18. * setAntiAlias(boolean aa);
  19. * 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
  20. *
  21. * setDither(boolean dither);
  22. * 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
  23. *
  24. * setFilterBitmap(boolean filter);
  25. * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示
  26. * 速度,本设置项依赖于dither和xfermode的设置
  27. *
  28. * setMaskFilter(MaskFilter maskfilter);
  29. * 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等       *
  30. * setColorFilter(ColorFilter colorfilter);
  31. * 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
  32. *
  33. * setPathEffect(PathEffect effect);
  34. * 设置绘制路径的效果,如点画线等
  35. *
  36. * setShader(Shader shader);
  37. * 设置图像效果,使用Shader可以绘制出各种渐变效果
  38. *
  39. * setShadowLayer(float radius ,float dx,float dy,int color);
  40. * 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
  41. *
  42. * setStyle(Paint.Style style);
  43. * 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE
  44. *
  45. * setStrokeCap(Paint.Cap cap);
  46. * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式
  47. * Cap.ROUND,或方形样式Cap.SQUARE
  48. *
  49. * setSrokeJoin(Paint.Join join);
  50. * 设置绘制时各图形的结合方式,如平滑效果等
  51. *
  52. * setStrokeWidth(float width);
  53. * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
  54. *
  55. * setXfermode(Xfermode xfermode);
  56. * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
  57. *
  58. * 2.文本绘制
  59. * setFakeBoldText(boolean fakeBoldText);
  60. * 模拟实现粗体文字,设置在小字体上效果会非常差
  61. *
  62. * setSubpixelText(boolean subpixelText);
  63. * 设置该项为true,将有助于文本在LCD屏幕上的显示效果
  64. *
  65. * setTextAlign(Paint.Align align);
  66. * 设置绘制文字的对齐方向
  67. *
  68. * setTextScaleX(float scaleX);
  69. * 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果
  70. *
  71. * setTextSize(float textSize);
  72. * 设置绘制文字的字号大小
  73. *
  74. * setTextSkewX(float skewX);
  75. * 设置斜体文字,skewX为倾斜弧度
  76. *
  77. * setTypeface(Typeface typeface);
  78. * 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
  79. *
  80. * setUnderlineText(boolean underlineText);
  81. * 设置带有下划线的文字效果
  82. *
  83. * setStrikeThruText(boolean strikeThruText);
  84. * 设置带有删除线的效果
  85. *
  86. */
  1. private class MyView2 extends View {
  2. public MyView2(Context context) {
  3. super(context);
  4. }
  5. @Override
  6. protected void onDraw(Canvas canvas)
  7. {
  8. super.onDraw(canvas);
  9. canvas.drawColor(Color.WHITE);
  10. Paint paint = new Paint();
  11. paint.setAntiAlias(true);
  12. paint.setColor(Color.RED);
  13. paint.setStyle(Paint.Style.STROKE);//设置为空心
  14. paint.setStrokeWidth(3);
  15. canvas.drawCircle(40, 40, 30, paint);
  16. canvas.drawRect(10, 90, 70, 150, paint);
  17. canvas.drawRect(10, 170, 70, 200, paint);
  18. canvas.drawOval(new RectF(10, 220, 70, 250), paint);
  19. Path path = new Path();//三角形
  20. path.moveTo(10, 330);
  21. path.lineTo(70, 330);
  22. path.lineTo(40, 270);
  23. path.close();
  24. canvas.drawPath(path, paint);
  25. Path path1 = new Path();//梯形
  26. path1.moveTo(10, 410);//绘画基点
  27. path1.lineTo(70, 410);
  28. path1.lineTo(55, 350);
  29. path1.lineTo(25, 350);
  30. path1.close();//把开始的点和最后的点连接在一起,构成一个封闭图形
  31. /*
  32. * 最重要的就是movtTo和close,如果是Style.FILL的话,不设置close,也没有区别,可是如果是STROKE模式,
  33. * 如果不设置close,图形不封闭。
  34. *
  35. * 当然,你也可以不设置close,再添加一条线,效果一样。
  36. */
  37. canvas.drawPath(path1, paint);
  38. ///////////////////////////////////////第二列
  39. paint.setColor(Color.BLUE);
  40. paint.setStyle(Paint.Style.FILL);//设置实心
  41. canvas.drawCircle(120, 40, 30, paint);
  42. canvas.drawRect(90, 90, 150, 150, paint);
  43. canvas.drawRect(90, 170, 150, 200, paint);
  44. RectF re2 = new RectF(90, 220, 150, 250);
  45. canvas.drawOval(re2, paint);
  46. Path path2 = new Path();
  47. path2.moveTo(90, 330);
  48. path2.lineTo(150, 330);
  49. path2.lineTo(120, 270);
  50. path2.close();
  51. canvas.drawPath(path2, paint);
  52. Path path3 = new Path();
  53. path3.moveTo(90, 410);
  54. path3.lineTo(150, 410);
  55. path3.lineTo(135, 350);
  56. path3.lineTo(105, 350);
  57. path3.close();
  58. canvas.drawPath(path3, paint);
  59. ////////////////////////////////////////////////////第三列
  60. /*
  61. * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new
  62. * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,
  63. * 1.0f}, TileMode.MIRROR);
  64. * 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点
  65. * 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,
  66. * 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布
  67. */
  68. Shader mShader = new LinearGradient(0, 0, 100, 100,
  69. new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },
  70. null, Shader.TileMode.REPEAT);
  71. // Shader.TileMode三种模式
  72. // REPEAT:沿着渐变方向循环重复
  73. // CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色
  74. // MIRROR:与REPEAT一样都是循环重复,但这个会对称重复
  75. paint.setShader(mShader);// 用Shader中定义定义的颜色来话
  76. canvas.drawCircle(200, 40, 30, paint);
  77. canvas.drawRect(170, 90, 230, 150, paint);
  78. canvas.drawRect(170, 170, 230, 200, paint);
  79. RectF re3 = new RectF(170, 220, 230, 250);
  80. canvas.drawOval(re3, paint);
  81. Path path4 = new Path();
  82. path4.moveTo(170, 330);
  83. path4.lineTo(230, 330);
  84. path4.lineTo(200, 270);
  85. path4.close();
  86. canvas.drawPath(path4, paint);
  87. Path path5 = new Path();
  88. path5.moveTo(170, 410);
  89. path5.lineTo(230, 410);
  90. path5.lineTo(215, 350);
  91. path5.lineTo(185, 350);
  92. path5.close();
  93. canvas.drawPath(path5, paint);
  94. //////////////////////////////////第4列
  95. paint.setTextSize(24);
  96. canvas.drawText("圆形", 240, 50, paint);
  97. canvas.drawText("正方形", 240, 120, paint);
  98. canvas.drawText("长方形", 240, 190, paint);
  99. canvas.drawText("椭圆形", 240, 250, paint);
  100. canvas.drawText("三角形", 240, 320, paint);
  101. canvas.drawText("梯形", 240, 390, paint);
  102. }
  103. }

【转】(转)【Android】Paint的效果研究的更多相关文章

  1. 【转】Android Paint之 setXfermode PorterDuffXfermode 讲解

    [置顶] Android Paint之 setXfermode PorterDuffXfermode 讲解 分类: android动效篇2015-04-07 17:23 978人阅读 评论(8) 收藏 ...

  2. Android Paint的使用以及方法介绍(附源码下载)

    要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...

  3. Android ---paint类

    引自:http://www.cnblogs.com/-OYK/archive/2011/10/25/2223624.html Android Paint和Color类   要绘图,首先得调整画笔,待画 ...

  4. Android与Unity交互研究

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/46733221 Android与Unity交互研究 unity与android交互的由来 ...

  5. Android插屏动画效果

    公司研发SDK,须要类似有米插屏的动画效果,研究了下,写了一个DEMO,凝视非常具体了. <span style="font-size:24px;">package c ...

  6. 【Android源代码下载】收集整理android界面UI效果源码

    在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...

  7. 关于android内存泄漏的研究

    博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客.好了 ...

  8. android 1.6 launcher研究之自定义ViewGroup (转 2011.06.03(二)——— android 1.6 launcher研究之自定义ViewGroup )

    2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup2011.06.03(2)——— android 1.6 launcher研究之自定义ViewG ...

  9. 转:Android推送技术研究

    Android推送技术研究 字数5208 阅读4026 评论5 喜欢35 前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些 ...

随机推荐

  1. TinyMCE在线编辑器使用方法初探

    首先,下载TinyMCE包,地址:http://www.tinymce.com/ 然后将下载后的包解压,放置到一个文件夹下,创建一个html文件,并在其中书写如下代码: <!DOCTYPE ht ...

  2. 将MyApp.exe和Autorun.lnk添加到NK里,在project.bib文件内加入

    1. 将应用程序和应用程序快捷方式添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行:2. 直接替换Wince的SHELL,即修改注册表: [HKEY_LOCA ...

  3. 典型Event ID

    Sr no Event ID 2003 Server Event ID 2008 Server Event Type 1 528 4624 Local User logon 2 6008 6008 U ...

  4. 《GK101任意波发生器》升级固件发布(版本:1.0.2.build124)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build124 编译日期:2014-08-19 ====================================== 二. ...

  5. Java类型相互转换byte[]类型,blob类型

    在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...

  6. Js组件的一些写法【转】

    首先看下Prototype里的写法: var Class = { create: function() { return function() { this.init.apply(this, argu ...

  7. HDU 1789 贪心经典

    题意 给出n门作业的截止时间与分数 如果不能在那天结束前做完就扣掉相应分数 问怎么安排能让扣分最少 思路 先按分数从大到小排序 先研究大的 做好标记 一开始每天都能放作业 全是true 如果这一天已经 ...

  8. Radeon HD 7850 vs Radeon R9 270X

    Radeon HD 7850 vs Radeon R9 270X  HW compare   Intro The Radeon HD 7850 comes with a GPU core speed ...

  9. PTF 安装及简单测试 Packet Testing Framework

    PTF PTF is a Python based dataplane test framework. It is based on unittest, which is included in th ...

  10. Javascript 笔记与总结(2-11)暴力操作节点

    innerHTML 代表节点内的内容,能读能写 虽然不是 W3C 规定的标准,但是各浏览器都支持得很好 [例] <!DOCTYPE html> <html lang="en ...