Android图形之PathEffect类

1.PathEffect API示例给出了如何应用每一种效果的指导说明。
到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect是用来控制绘制轮廓(线条)的方式。

PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。

使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括:

CornerPathEffect  可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。

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

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

PathDashPathEffect  这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。

下面的效果可以在一个Paint中组合使用多个Path Effect。

ComposePathEffect  将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。


SumPathEffect  顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。


对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。

使用setPathEffect方法可以把PathEffect应用到Paint对象中。

2.下面的示例将会逐一使用上面的绘制效果

 1 package com.example.myandroidtest2;
 2 
 3 import android.annotation.SuppressLint;
 4 import android.app.Activity;
 5 import android.content.Context;
 6 import android.graphics.Canvas;
 7 import android.graphics.Color;
 8 import android.graphics.ComposePathEffect;
 9 import android.graphics.CornerPathEffect;
10 import android.graphics.DashPathEffect;
11 import android.graphics.DiscretePathEffect;
12 import android.graphics.Paint;
13 import android.graphics.Path;
14 import android.graphics.PathDashPathEffect;
15 import android.graphics.PathEffect;
16 import android.graphics.SumPathEffect;
17 import android.os.Bundle;
18 import android.view.View;
19 
20 public class PathTest extends Activity {
21     /** Called when the activity is first created. */
22     @Override
23     public void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(new MyView(this));
26     }
27 
28     class MyView extends View {
29         float phase;
30         PathEffect[] effects = new PathEffect[7];
31         int[] colors;
32         private Paint paint;
33         Path path;
34 
35         public MyView(Context context) {
36             super(context);
37             paint = new Paint();
38             paint.setStyle(Paint.Style.STROKE);
39             paint.setStrokeWidth(4);
40             // 创建,并初始化Path
41             path = new Path();
42             path.moveTo(0, 0);
43             for (int i = 1; i <= 15; i++) {
44                 // 生成15个点,随机生成它们的坐标,并将它们连成一条Path
45                 path.lineTo(i * 20, (float) Math.random() * 60);
46             }
47             // 初始化七个颜色
48             colors = new int[] { Color.BLACK, Color.BLUE, Color.CYAN, Color.GREEN, Color.MAGENTA, Color.RED,
49                     Color.YELLOW };
50         }
51 
52         @SuppressLint("DrawAllocation")
53         protected void onDraw(Canvas canvas) {
54             // 将背景填充成白色
55             canvas.drawColor(Color.WHITE);
56             // -------下面开始初始化7中路径的效果
57             // 使用路径效果
58             effects[0] = null;
59             // 使用CornerPathEffect路径效果
60             effects[1] = new CornerPathEffect(10);
61             // 初始化DiscretePathEffect
62             effects[2] = new DiscretePathEffect(3.0f, 5.0f);
63             // 初始化DashPathEffect
64             effects[3] = new DashPathEffect(new float[] { 20, 10, 5, 10 }, phase);
65             // 初始化PathDashPathEffect
66             Path p = new Path();
67             p.addRect(0, 0, 8, 8, Path.Direction.CCW);
68             effects[4] = new PathDashPathEffect(p, 12, phase, PathDashPathEffect.Style.ROTATE);
69             // 初始化PathDashPathEffect
70             effects[5] = new ComposePathEffect(effects[2], effects[4]);
71             effects[6] = new SumPathEffect(effects[4], effects[3]);
72             // 将画布移到8,8处开始绘制
73             canvas.translate(8, 8);
74             // 依次使用7中不同路径效果,7种不同的颜色来绘制路径
75             for (int i = 0; i < effects.length; i++) {
76                 paint.setPathEffect(effects[i]);
77                 paint.setColor(colors[i]);
78                 canvas.drawPath(path, paint);
79                 canvas.translate(0, 60);
80             }
81             // 改变phase值,形成动画效果
82             phase += 1;
83             invalidate();
84         }
85     }
86 }

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。