android基礎--canvas繪圖


Android繪圖方法主要有兩個步驟: 

  (1)實現一個繼承於View組件的類,並重寫它的onDraw(Canavas canvas)方法;  

  (2)顯示定義的View子類,有兩種方法:

a.使用一個Activity來顯示View子類,即 setContentView(new MyView(this, null));

b.在Acitviy的佈局文件中增加"包名.View子類"元素,Activiyty通過setContentView方法來使用該佈局文件。

下面我們來學習下Android繪製圖形的三個最重要的API工具。

一、Android繪圖三大API1.Canvas類
(1)功能:Canvas代表了"依附"於指定View的畫布,通過Canvas類的成員方法能夠實現繪製各種圖形。繪製一個圖形由四部分組成:Bitmap、Canvas、Path/Rect/text等、Paint,其中Bitmap爲繪製圖形存放的像素位圖,Canvas用於提供繪製圖像方法、Paint爲畫筆、Path/Rect/text等分別爲繪製圖形的(軌跡/矩形/文本)

(2)構造方法Canvas() :構造空的canvas對象Canvas(Bitmap bitmap) :構造一個Canvas對象,並指定其bitmap

(3)常用方法

boolean clipRegion(Region region):剪切指定區域
void drawBitmap(Bitmap bitmap,float left, float top, Paint paint):在指定點(x,y)使用指定的畫筆paint繪製位圖
void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint):在指定點(x,y)繪製從源位圖中"挖取"的一塊
void drawCircle(floatcx, float cy, float radius, Paint paint):繪製原點爲(cx,cy),半徑爲radius的圓
void drawLine(floatstartX, float startY, float stopX, float stopY, Paint paint):繪製一條起點爲(startX,startY),終點爲(stopX,stopY)直線
void drawLines(float[]pts, int offset, int count, Paint paint):繪製多條直線,其中pts爲一個浮點型數組提供繪製一條直接所需的數據(4個/條),count爲繪製直線的條數
void drawOval(RectF oval, Paint paint):繪製一個橢圓,oval爲繪製橢圓的矩形邊界
void drawPath(Path path, Paint paint):沿着路徑path繪製圖形
void drawPoint(floatx, float y, Paint paint):繪製一個點(x,y)
void drawPoints(float[]pts, int offset, int count, Paint paint):繪製pts數組中的多個點(2個值/點)
void drawRect(floatleft, float top, float right, float bottom, Paint paint):繪製一個矩形,其參數爲距離屏幕邊界的距離(邊界爲0)
void drawRoundRect(RectF rect,float rx, float ry, Paint paint):使用指定的畫筆繪製圓角矩形,其中rect爲矩形邊界、rx/ry分別爲以矩形頂點爲(0,0)相對位置圓的x半徑、y半徑
void drawText(String text,float x, float y, Paint paint):以(x,y)爲原點,使用指定畫筆繪製文本
void drawTextOnPath(String text, Path path,float x, float y, Paint paint):以(x,y)爲原點,使用指定的畫筆沿着指定路徑繪製文本
int getHeight():返回當前圖層的高度
int getWidth():返回當前繪圖層的寬度
void rotate(floatdegrees):對Canvas執行旋轉變換;
void setBitmap(Bitmap bitmap):指定Canvas(畫布)的位圖Bitmap
void translate(floatdx, float dy):相對於當前位置移動Canvas。向右移動dx距離(dx爲負數即向左移動);向下移動dy距離(dy爲負數即向上移動)
void skew(float sx,float sy):對Canvas執行傾斜變換

2.Paint類


(1)功能:Paint代表了Canvas上的畫筆,Paint類主要用於設置繪製風格,包括畫筆的顏色、畫筆筆觸粗細、填充風格等。(2)構造方法Paint() :使用默認設置構造一個Paint對象Paint(int flags) :使用指定flags構造一個Paint對象Paint(Paint paint) :使用已有畫筆的設置構造一個新的Paint對象(3)常用方法
void reset():恢復畫筆到默認配置
void setARGB(inta, int r, int g, int b):設置畫筆透明度和顏色,其參數分別代表透明度、紅色、綠色、藍色
void setAlpha(inta):設置畫筆的透明度
void setAntiAlias(booleanaa):設置是否抗鋸齒
void setColor(intcolor):設置畫筆的顏色
void setFlags(intflags):設置畫筆的flags(HINTING_OFF、HINTING_ON等)
void setHinting(intmode):設置畫筆的提示模式
PathEffect setPathEffect(PathEffect effect):設置繪製路徑時的路徑效果(ComposePathEffect,CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect)
Rasterizer setRasterizer(Rasterizer rasterizer)
Shader setShader(Shader shader):設置畫筆的填充效果(BitmapShader,ComposeShader, LinearGradient, RadialGradient, SweepGradient)
void setShadowLayer(floatradius, float dx, float dy, int color):設置陰影效果
void setStrokeJoin(Paint.Join join):設置畫筆轉彎處的連接風格(BEVEL-直線、MITER-銳角、ROUND-圓弧 )
void setStrokeWidth(floatwidth):設置畫筆寬度
void setStyle(Paint.Style style):設置Paint的填充風格(FILL-、FILL_AND_STROKE、STROKE )
void setTextAlign(Paint.Align align):設置繪製文本時的文字對齊方式(CENTER-居中、LEFT-靠左、RIGHT -靠右:以(x,y)爲中心)
void setTextSize(floattextSize):設置繪製文本的文字大小
3.Path類
(1)功能:Android提供的Path類預先在View上將N個點連成一條"路徑",然後調用Canvas的drawPath(path,paint)方法即可沿着路徑繪製圖形。另外,Android還提供了PathEffect來定義繪製路徑圖形效果,其包含ComposePathEffect、CornerPathEffect、DashPathEffect、DiscretePathEffect、PathDashPathEffect、SumPathEffect六種效果(2)構造方法Path():構造一個Path對象Path(Path src) :從另一個Path對象構造一個新的Path對象(3)常用方法
boolean isEmpty():判定Path對象是否爲空(即不包含直線或曲線),如果爲空返回true
void lineTo(floatx, float y):增加一條從上一點到當前點(x,y)的直線
void moveTo(floatx, float y):設置下一個輪廓的開始點(x,y)
void rLineTo(floatdx, float dy):以座標爲參照增加一條從上一點到當前點(x,y)的直線
void rMoveTo(floatdx, float dy):以座標爲參照設置下一個輪廓的開始點(x,y)
void reset():刪除Path對象的所有直線和曲線
void set(Path src):將當前Path對象的內容替換爲對象src所包含的內容
void setFillType(Path.FillType ft):設置路徑的填充類型
void setLastPoint(floatdx, float dy):設置路徑的最後一個點的座標爲(x,y)
void transform(Matrix matrix):通過matrix轉換該路徑中的點
void 
close() :釋放資源

二、常見幾何圖形/文本的繪製方法1.畫筆常用設置(1)無填充風格new Paint() .setAntiAlias(true);                      // 去鋸齒                    .setColor(Color.BLUE);             // 設置畫筆爲藍色                   .setStyle(Paint.Style.STROKE); // 設置畫筆的填充風格(2)有填充風格 new Paint() .setStyle(Paint.Style.FILL);   //填充整個圖形區域                    .setColor(Color.RED);          //填充顏色爲紅色(3)設置漸變器Shader mShader = new LinearGradient(0,0,40,60                                            ,new int[] {Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW}                                            ,null,Shader.TileMode.REPEAT);new Paint() .setShader(mShader);                  .setShadowLayer(45, 10, 10, Color.GRAY);2.常見幾何圖形/文本(屏幕左上角爲參考原點(0,0,屏幕邊界均爲0))(1)繪製圓形:原點爲(30,30),半徑爲30.  Canvas canvas = new Canvas();  canvas.drawCircle(30, 30, 30, paint);(2)繪製正方形:以屏幕左上角爲參考原點(0,0),(左,上)=(30,30)、(右,下)=(200,200)  Canvas canvas = new Canvas();
  canvas.drawRect(30, 30, 200, 200, paint);
(3)繪製矩形  Canvas canvas = new Canvas();  canvas.drawRect(10, 150, 70, 190, paint);(4)繪製圓角矩形:re1爲相對於屏幕爲(0,0)點,座標爲(30,30)和(200,200)的矩形;(30,30)爲相對矩形的四個頂點爲零點繪製在矩形內部的圓點爲半徑x、y軸爲15的=半徑的圓,最後矩形四個角取與圓的公共部分。圓的半徑越大,矩形四個角越圓。 Canvas canvas = new Canvas();
  RectF re1 = new RectF(30, 30, 200, 200);  canvas.drawRoundRect(re1, 15, 15, paint);
(5)繪製橢圓:以屏幕左上角爲參照零點(0,0),2a=100-30,2b=310-260  Canvas canvas = new Canvas();
  RectF re11 = new RectF(30,260,100, 310);  canvas.drawOval(re11, paint);
(6)繪製三角形(藉助Path類):以屏幕左上角爲參照零點(0,0),起點爲(10,340)、 Canvas canvas = new Canvas();
  Path path1 = new Path();  path1.moveTo(10, 340);  path1.lineTo(70, 340);  path1.lineTo(40, 290);  path1.close();  canvas.drawPath(path1, paint);
(7)繪製五角形(藉助Path類) Canvas canvas = new Canvas();
  Path path2 = new Path();  path2.moveTo(26, 360);  path2.lineTo(54, 360);  path2.lineTo(70, 392);  path2.lineTo(40, 420);  path2.lineTo(10, 392);  path2.close();  canvas.drawPath(path2, paint);(8)繪製文本:字符串起始位置爲(30,30)new Paint() .setTextSize(30);           //文本字體大小                  .setShader(null);             //無陰影效果Canvas canvas = new Canvas();
canvas.drawText(getResources().getString(R.string.circle), 30, 30, paint);
3.源碼實戰:繪製圖形(1)繼承View的子類MyView.java
<span style="font-family:Times New Roman;"><span style="font-size:18px;">package com.example.canvaspaint;
public class MyView extends View {
 // 1.構造方法
 public MyView(Context context, AttributeSet set) {
  super(context, set);
 }

 // 2.重寫onDraw方法進行繪圖
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  // a.初始化畫布、畫筆
  canvas.drawColor(Color.WHITE); // 設置畫布繪製成白色
  Paint paint = new Paint();
  paint.setAntiAlias(true); // 去鋸齒
  paint.setColor(Color.BLUE); // 設置畫筆爲藍色
  paint.setStyle(Paint.Style.STROKE); // 設置畫筆的填充風格

  /*------------------------無填充風格繪製----------------------------*/

  // b.繪製圓形
  canvas.drawCircle(30, 30, 30, paint);
  // c.繪製正方形
  canvas.drawRect(10, 30, 50, 50, paint);
  // d.繪製矩形
  canvas.drawRect(30, 30, 200, 200, paint);
  // e.繪製圓角矩形
  RectF re1 = new RectF(30,30, 200, 200);
  canvas.drawRoundRect(re1, 30,30, paint);
  // f.繪製橢圓
  RectF re11 = new RectF(30,30,100, 80);
  canvas.drawOval(re11, paint);
   //g.定義一個Path對象,封閉成一個三角形並根據Path對象繪製
  Path path1 = new Path();
  path1.moveTo(10, 340);
  path1.lineTo(70, 340);
  path1.lineTo(40, 290);
  path1.close();
  canvas.drawPath(path1, paint);
  // h.根據Path繪製五角形
  Path path2 = new Path();
  path2.moveTo(26, 360);
  path2.lineTo(54, 360);
  path2.lineTo(70, 392);
  path2.lineTo(40, 420);
  path2.lineTo(10, 392);
  path2.close();
  canvas.drawPath(path2, paint);

  /*------------------------設置填充風格後繪製----------------------------*/
  paint.setStyle(Paint.Style.FILL);
  paint.setColor(Color.RED);
  // b.繪製圓形
  canvas.drawCircle(120, 40, 30, paint);
  // c.繪製正方形
  canvas.drawRect(90, 80, 150, 140, paint);
  // d.繪製矩形
  canvas.drawRect(90, 150, 150, 190, paint);
  // e.繪製圓角矩形
  RectF re2 = new RectF(90, 200, 70, 230);
  canvas.drawRoundRect(re2, 15, 15, paint);
  // f.繪製橢圓
  RectF re22 = new RectF(90, 240, 150, 270);
  canvas.drawOval(re22, paint);
  // g.定義一個Path對象,封閉成一個三角形並根據Path對象繪製
  Path path3 = new Path();
  path3.moveTo(90, 340);
  path3.lineTo(150, 340);
  path3.lineTo(120, 290);
  path3.close();
  canvas.drawPath(path3, paint);
  // h.根據Path繪製五角形
  Path path4 = new Path();
  path4.moveTo(106, 360);
  path4.lineTo(134, 360);
  path4.lineTo(150, 392);
  path4.lineTo(120, 420);
  path4.lineTo(90, 392);
  path4.close();
  canvas.drawPath(path4, paint);
 
/*------------------------設置漸變器後繪製----------------------------*/
 
  Shader mShader = new LinearGradient(0,0,40,60,new int[] {Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,Shader.TileMode.REPEAT);
  paint.setShader(mShader);
  paint.setShadowLayer(45, 10, 10, Color.GRAY);
  //b.繪製圓形
  canvas.drawCircle(200,40,30, paint);
  //c.繪製正方形
  canvas.drawRect(170,80,230,140,paint);
  //d.繪製矩形
  canvas.drawRect(170, 150, 230, 190, paint);
  //e.繪製圓角矩形
  RectF re3= new RectF(170,200,230,230);
  canvas.drawRoundRect(re3, 15, 15, paint);
  //f.繪製橢圓
  RectF re33 = new RectF(170,240,230,270);
  canvas.drawOval(re33, paint);
  //g.定義一個Path對象,封閉成一個三角形並根據Path對象繪製
  Path path5 = new Path();
  path5.moveTo(170, 340);
  path5.lineTo(230, 340);
  path5.lineTo(200, 290);
  path5.close();
  canvas.drawPath(path5, paint);
  //h.根據Path繪製五角形
  Path path6 = new Path();
  path6.moveTo(186, 360);
  path6.lineTo(241, 360);
  path6.lineTo(230, 392);
  path6.lineTo(200, 420);
  path6.lineTo(170, 392);
  path6.close();
  canvas.drawPath(path6, paint);
 
  /*---------------設置字符大小後繪製---------------*/
  paint.setTextSize(30);
  paint.setShader(null);
//	 //繪製7個字符串
  canvas.drawText(getResources().getString(R.string.circle), 30, 30, paint);
  canvas.drawText(getResources().getString(R.string.square), 240, 120, paint);
  canvas.drawText(getResources().getString(R.string.rect), 240, 175, paint);
  canvas.drawText(getResources().getString(R.string.round_rect), 230, 220, paint);
  canvas.drawText(getResources().getString(R.string.oval), 240, 260, paint);
  canvas.drawText(getResources().getString(R.string.triangle), 240, 325, paint);
  canvas.drawText(getResources().getString(R.string.pentagon), 240, 390, paint);
 }
}</span></span>

(2)應用界面顯示該View子類CanvasTest.java
<span style="font-family:Times New Roman;"><span style="font-size:18px;">package com.example.canvaspaint;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class CanvasTest extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this, null));
    }
}</span></span>
效果演示:

二、Path類的使用
1.Path使用    Canvas沿着路徑繪製圖形,我們可以這樣來定義一條路徑:(1)構造一個Path對象;(2)調用Path的moveTo(x,y)方法設定路徑的起點;(3)調用lineTo(x,y)方法設定下一個點的位置。(1)設置Path路徑效果:首先需要創建一個PathEffect子類對象,然後再調用Piant的setPathEffect(PathEffectp)方法即可。(2)沿着路徑繪製文本:首先需要設定路徑的形狀,然後設置好畫筆並調用Canvas的drawPath(Path path,Paint paint)方法沿着路徑繪製圖形,最後調用Canvas的drawTextOnPath(Stringtext, Path path, float hOffset, float vOffset, Paint paint)方法繪製路徑文本,其中hOffset爲相對於路徑起點距離的水平位置,hOffset爲相對於路徑上或下距離。2.源碼實戰:(1)PathTest.java:使用PathEffect類的6個子類實現6種不同的路徑繪製效果
<span style="font-family:Times New Roman;"><span style="font-size:18px;">package com.example.android_path;
public class PathTest extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));
    }
    /*-----------------------構造方法---------------------------*/
    class MyView extends View
    {
  float phase;
     PathEffect[] effects = new PathEffect[7];
     int[] colors;
     private Paint paint;
     Path path;
     public MyView(Context context) {
   super(context);
   //1.初始化畫筆Paint
   paint = new Paint();	//實例化一個(畫筆)Paint對象
   paint.setStyle(Paint.Style.STROKE);	//設置Paint的填充風格
   paint.setStrokeWidth(4);
   //2.創建並初始化Path
   path = new Path();
   path.moveTo(0, 0);
   for(int i=1;i<=15;i++)
   {
    //生成15個點,隨機生成它們的Y座標,並將它們生成一條Path
    path.lineTo(i*20, (float)Math.random()*60);
   }
   //3.初始化7個顏色
   colors = new int[] {Color.BLACK,Color.RED,Color.BLUE,Color.GRAY,Color.GREEN,Color.MAGENTA,Color.YELLOW};
  } 
      /*-----------------------繪圖---------------------------*/
      @Override
  protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   canvas.drawColor(Color.WHITE);	//將畫布背景填充成白色
   //4.初始化7種路徑效果
   effects[0]=null;	 //a.不使用路徑效果
   effects[1] = new CornerPathEffect(10);	 //b.初始化CornerPathEffect
   effects[2] = new DiscretePathEffect(3.0f,5.0f);	 //c.初始化DiscretePathEffect
   effects[3] = new DashPathEffect(new float[] {20,10,5,10}, phase);	 //d.初始化DashPathEffect
   Path p = new Path();
   p.addRect(0, 0, 8, 8, Path.Direction.CCW);
   effects[4] = new PathDashPathEffect(p, 12, phase, PathDashPathEffect.Style.ROTATE);	//e.初始化PathDashPathEffect
   effects[5] = new ComposePathEffect(effects[2],effects[3]);	 //f.初始化ComposePathEffect
   effects[6] = new SumPathEffect(effects[4], effects[3]);	 //g.初始化SumPathEffect
   //5.將畫布移動到(8,8)處開始繪製,依次使用7中不同路徑效果、7中不同的顏色來繪製路徑
   canvas.translate(8, 8);
   for(int i=0;i<effects.length;i++)
   {
    paint.setPathEffect(effects[i]);
    paint.setColor(colors[i]);
    canvas.drawPath(path, paint);
    canvas.translate(0, 60);
   }
   //6.改變phase值,形成動畫效果
   phase +=1;
   invalidate();
  }
    }
}</span></span>

效果演示:
分析:在上面的程序中,當定義DashPathEffect、PathDashPathEffect時可以指定一個phase參數,該參數用於指定路徑效果的相位,當該phase參數不斷地變化時,程序將不停得繪製該View組件,就會產生動畫效果。另外,View的invalidate()方法就是使當前的View視圖失效然後再次調用View的onDraw(Canvascanvas)方法重新繪圖,需要注意的是invalidate()方法只能在UI線程中使用。(2)PathText.java:沿着路徑繪製文本
<span style="font-family:Times New Roman;"><span style="font-size:18px;">package com.example.path;
/*沿着Path繪製文本*/
public class PathText extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(new ViewText(this));
 }
	
 class ViewText extends View
 {
  final String DRAW_STR = "何以笙簫默";
  Path[] paths = new Path[3];
  Paint paint;
  
  /*----------------------構造方法--------------------------*/
  
  public ViewText(Context context) {
   super(context);
   paths[0] = new Path();
   paths[0] .moveTo(0, 0); 
    //第一條路徑:自動生成7個點連成一條線 
   for(int i=1;i<=7;i++)        
   {
     paths[0].lineTo(i*30, (float)Math.random()*30);
   }
    //第二條路徑:爲一個橢圓(200,120)
   paths[1] = new Path();
   RectF rectF = new RectF(0,0,200,120);
   paths[1].addOval(rectF, Path.Direction.CCW);
  //第三條路徑:爲一條圓弧
   paths[2] = new Path();
   paths[2].addArc(rectF, 60, 180);
   //2.初始化畫筆
   paint = new Paint();
   paint.setAntiAlias(true);
   paint.setColor(Color.RED);
   paint.setStrokeWidth(1);
  }

  /*-------------------------繪圖---------------------------------*/
  @Override
  protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   canvas.drawColor(Color.WHITE);	 //設置畫布背景爲白色
   canvas.translate(40, 40);
   //a.設置從右邊開始繪製(右對齊)
   paint.setTextAlign(Paint.Align.RIGHT);
   paint.setTextSize(20);
   //b.繪製第一條路徑
   paint.setStyle(Paint.Style.STROKE);	 //繪製路徑
   canvas.drawPath(paths[0],paint);
   paint.setStyle(Paint.Style.FILL);//沿着路徑繪製一段文本
   canvas.drawTextOnPath(DRAW_STR, paths[0], -8, 20, paint);
    //對Canvas進行座標變換,畫布下移120
    canvas.translate(0, 60);
   //c.繪製第二條路徑
   paint.setStyle(Paint.Style.STROKE);	//繪製路徑
   canvas.drawPath(paths[1], paint);
   paint.setStyle(Paint.Style.FILL);	 //沿着路徑繪製一段文本
   canvas.drawTextOnPath(DRAW_STR, paths[1], -20, 20, paint);
    //對Canvas進行座標變換,畫布下移120
    canvas.translate(0, 120);
   //d.繪製第三條路徑
   paint.setStyle(Paint.Style.STROKE);	//繪製路徑
   canvas.drawPath(paths[2], paint);
   paint.setStyle(Paint.Style.FILL);	 //沿着路徑繪製一段文本
   canvas.drawTextOnPath(DRAW_STR, paths[2], -10, 20, paint);
   
  }
  
 }
}</span></span>

效果演示:



繪製文本

普通水平繪製drawText

這個比較簡單,但是需要注意繪製text繪製精確位置使用FontMetrics,主要包含四個參數:

ascent = ascent線的y座標 - baseline線的y座標;
descent = descent線的y座標 - baseline線的y座標;
top = top線的y座標 - baseline線的y座標;
bottom = bottom線的y座標 - baseline線的y座標;

指定每個文字位置

void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
void drawPosText (String text, float[] pos, Paint paint)

參數說明

char[] text:要繪製的文字數組
int index::第一個要繪製的文字的索引
int count:要繪製的文字的個數,用來算最後一個文字的位置,從第一個繪製的文字開始算起
float[] pos:每個字體的位置,同樣兩兩一組,如{x1,y1,x2,y2,x3,y3……}
float []pos=new float[]{80,100,
            100,200,
            120,300,
            140,400};
canvas.drawPosText("1234", pos, paint);


··

沿路徑繪製

void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint) 
void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

參數說明:

float hOffset : 與路徑起始點的水平偏移距離
float vOffset : 與路徑中心的垂直偏移量
    String string = "測試文字偏移的參數";

    Path circlePath = new Path();
    circlePath.addCircle(220, 200, 100, Path.Direction.CCW);
    canvas.drawPath(circlePath, paint_red);//繪製出路徑原形

    Path circlePath2 = new Path();
    circlePath2.addCircle(550, 200, 100, Path.Direction.CCW);
    canvas.drawPath(circlePath2, paint_red);//繪製出路徑原形

    paint_green.setTextSize(30);

     //hoffset、voffset參數值全部設爲0,看原始狀態是怎樣的
    canvas.drawTextOnPath(string, circlePath, 0, 0, paint_green);
    //第二個路徑,改變hoffset、voffset參數值
    canvas.drawTextOnPath(string, circlePath2, 80, 30, paint_green);


http://www.jianshu.com/p/56048ce85946


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章