[转载]Android 高级绘图

高级画布绘图

          我们已经介绍了Canvas,在那里,已经学习了如何创建自己的View。在第7章中也使用了Canvas来为MapView标注覆盖。

          画布(Canvas)是图形编程中一个很普通的概念,通常由三个基本的绘图组件组成:

        
Canvas  提供了绘图方法,可以向底层的位图绘制基本图形。

       Paint  也称为"刷子",Paint可以指定如何将基本图形绘制到位图上。
       Bitmap  绘图的表面。

           Android绘图API支持透明度、渐变填充、圆边矩形和抗锯齿。遗憾的是,由于资源限制,它还不支持矢量图形,它使用的是传统光栅样式的重新绘图。
          这种光栅方法的结果是提高了效率,但是改变一个Paint对象不会影响已经画好的基本图形,它只会影响新的元素。

          提示:
          如果你拥有Windows开发背景,那么Android的2D绘图能力大致相当于GDI+的能力。

       1. 可以画什么?

          Canvas类封装了用作绘图表面的位图;它还提供了draw*方法来实现设计。

          下面的列表提供了对可用的基本图形的简要说明,但并没有深入地探讨每一个draw方法的详细内容:

          drawARGB / drawRGB / drawColor   使用单一的颜色填充画布。
          drawArc   在一个矩形区域的两个角之间绘制一个弧。
          drawBitmap   在画布上绘制一个位图。可以通过指定目标大小或者使用一个矩阵来改变目标位图的外观。
          drawBitmapMesh   使用一个mesh(网)来绘制一个位图,它可以通过移动网中的点来操作目标的外观。
          drawCircle   以给定的点为圆心,绘制一个指定半径的圆。
          drawLine(s)   在两个点之间画一条(多条)直线。
          drawOval   以指定的矩形为边界,画一个椭圆。
          drawPaint   使用指定的Paint填充整个Canvas
          drawPath   绘制指定的Path。Path对象经常用来保存一个对象中基本图形的集合。
          drawPicture   在指定的矩形中绘制一个Picture对象。
          drawPosText   绘制指定了每一个字符的偏移量的文本字符串。
          drawRect   绘制一个矩形。
          drawRoundRect   绘制一个圆角矩形。
          drawText   在Canvas上绘制一个文本串。文本的字体、大小和渲染属性都设置在用来渲染文本的Paint对象中。
          drawTextOnPath   在一个指定的path上绘制文本。
          drawVertices   绘制一系列三角形面片,通过一系列顶点来指定它们。

          这些绘图方法中的每一个都需要指定一个Paint对象来渲染它。在下面的部分中,将学习如何创建和修改Paint对象,从而在绘图中完成大部分工作。

       2. 从Paint中完成工作

          Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘制在画布上的基本图形。通过修改Paint对象,可以在绘图的时候控制颜色、样式、字体和特殊效果。最简单地,setColor可以让你选择一个Paint的颜色,而Paint对象的样式(使用setStyle控制)则可以决定是绘制绘图对象的轮廓(STROKE),还是只填充每一部分(FILL),或者是两者都做(STROKE_AND_FILL)

          除了这些简单的控制之外,Paint类还支持透明度,另外,它也可以通过使用各种各样的阴影、过滤器和效果进行修改,从而提供由更丰富的、复杂的画笔和颜料组成的调色板。

          Android SDK包含了一些非常好的实例,它们说明了Paint类中可用的大部分功能。你可以在API demos的graphics子目录中找到它们:

        
sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics

          在下面的部分中,将学习和使用其中的部分功能。这些部分只是简单地罗列了它们能实现的效果(例如渐变和边缘浮雕),而没有详细地列出所有可能的情况。

       使用透明度

           Android中的所有颜色都包含了一个不透明组件(alpha通道)。
           当创建一个颜色的时候,可以使用argb或者parseColor方法来定义它的alpha值,如下所示:

Java代码:
  1.     // 使用红色,并让它50%透明
  2.     int opacity = 127;
  3.     int intColor = Color.argb(opacity, 255, 0, 0);
  4.     int parsedColor = Color.parseColor("#7FFF0000");

复制代码
           或者,也可以使用setAlpha方法来设置已存在的Paint对象的透明度:

Java代码:
  1.     // 让颜色50%透明
  2.     int opacity = 127;
  3.     myPaint.setAlpha(opacity);
复制代码

          创建一个不是100%透明的颜色意味着,使用它绘制的任何基本图形都将是部分透明的--也就是说,在它下面绘制的所有基本图形都是部分可见的。

          可以在任何使用了颜色的类或者方法中使用透明效果,包括Paint、Shader和Mask Filter。

       Shader介绍

          Shader类的派生类可以创建允许使用多种固体颜色填充绘图对象的Paint。

          对Shader最常见的使用是定义渐变填充;渐变是在2D图像中添加深度和纹理的最佳方式之一。Android包含了一个Bitmap Shader和一个Compose Shader,同时,还包含了三个渐变的Shader。
          试图用语言来描述绘图的效果本来就是没有意义的,所以看一下图就应该可以知道每一种Shader是如何工作的。图中从左到右依次代表的是LinearGradient、RadialGradient和 SweepGradient.
提示:

          没有包含的是ComposerShader,它可以创建多个Shader和BitmapShader的组合,从而可以在一个位图图像的基础上创建一个绘图刷。

          要在绘图的时候使用一个Shader,可以使用setShader方法将其应用到一个Paint中,如下面的代码所示:
          Paint shaderPaint = new Paint();  
          shaderPaint.setShader(myLinearGradient);


          你使用这个Paint所绘制的任何东西都将使用你指定的Shader进行填充,而不是使用Paint本身的颜色进行填充。
        
定义渐变Shader

          如上所示,使用渐变Shader可以让你使用交替改变的颜色来填充图片;你可以将颜色渐变定义为两种颜色的简单交替,如下所示:

java代码:
  1.     int colorFrom = Color.BLACK;
  2.     int colorTo = Color.WHITE;
  3.     LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2, colorFrom, colorTo, TileMode.CLAMP);

复制代码

           或者,你还可以定义更复杂的按照设定比例进行分布的颜色序列,如下面的RadialGradientShader例子所示:

java代码:
  1.     int[] gradientColors = new int[3];
  2.     gradientColors[0] = Color.GREEN;
  3.     gradientColors[1] = Color.YELLOW;
  4.     gradientColors[2] = Color.RED;
  5.     float[] gradientPositions = new float[3];
  6.     gradientPositions[0] = 0.0f;
  7.     gradientPositions[1] = 0.5f;
  8.     gradientPositions[2] = 1.0f;
  9.     RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius, gradientColors, gradientPositions, TileMode.CLAMP);

复制代码

          每一种渐变Shader(线性的、辐射形的和扫描状的)都可以使用以上这两种技术来定义渐变填充。

        
使用Shader TileModes
          渐变Shader的画刷大小既可以显式地使用有边界的矩形来定义,也可以使用中心点和半径长度来定义。Bitmap Shader可以通过它的位图大小来决定它的画刷大小。

     

转载于:https://www.cnblogs.com/fuxiuyuan/archive/2012/04/14/2447545.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值