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 }