筆記參考自安卓自定義View進階-Path基本操作
package rc.loveq.canvas;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
* Author:Rc
* Csdn:http://blog.csdn.net/loveqrc
* 0n 2016/12/15 10:08
* Email:[email protected]
*/
public class PathView extends View {
private int mCenterX;
private int mCenterY;
private Paint mPaint;
public PathView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
public PathView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public PathView(Context context) {
this(context,null);
}
private void initPaint() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mCenterX = w/2;
mCenterY = h/2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//例子一
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.lineTo(200,200);
// path.lineTo(200,0);
// canvas.drawPath(path,mPaint);
//例子一總結:path默認是在原點,第二次lineTo沿用第一次lineTo的座標的位置(200,200)
//例子二
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.lineTo(200,200);
// path.moveTo(200,100);
// path.lineTo(200,0);
// canvas.drawPath(path,mPaint);
//例子二總結:moveTo會影響第二lineTo的起點,moveTo之後第二次lineTo的起點是(200,100)
//例子三
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.lineTo(200,200);
// path.setLastPoint(200,100);
// path.lineTo(200,0);
// canvas.drawPath(path,mPaint);
//例子三總結:setLastPoint,會影響第一次lineTo的終點(200,200),把第一次lineTo的
//終點改爲(200,100)
//例子四
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.lineTo(200,200);
// path.lineTo(200,0);
// path.close();
// canvas.drawPath(path,mPaint);
//例子四總結:close方法用於連接當前最後一個點和最初的一個點(如果兩個點不重合的話),
//最終形成一個封閉的圖形。
//例子五
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
//// path.addRect(-200,-200,200,200, Path.Direction.CCW);
//// path.addRect(-200,-200,200,200, Path.Direction.CW);
// canvas.drawPath(path,mPaint);
//例子五總結:因爲我們畫的是正方形所以這裏看不出Path.Direction.CCW
// 和Path.Direction.CW兩者的不同。
//例子六
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// RectF rectF=new RectF(-200,-200,200,200);
// path.addRect(rectF, Path.Direction.CCW);//CCW的英文全稱是counter-clockwise(逆時針)
// path.setLastPoint(200,-300);
// canvas.drawPath(path,mPaint);
//例子六總結:一開始矩陣四個點的座標分別是A(-200,-200) B(-200,200),C(200,200,)D(200,-200)
//因爲設置逆時針(順序就是 A -> B -> C -> D)所以D是最後的一個點
// path.setLastPoint(200,-300);所以現在的D座標是D(200,-300)
//例子七
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// RectF rectF=new RectF(-200,-200,200,200);
// path.addRect(rectF, Path.Direction.CW);//CW的英文全稱是 clockwise(順時針)
// path.setLastPoint(200,-300);
// canvas.drawPath(path,mPaint);
//例子七總結:一開始矩陣四個點的座標分別是A(-200,-200) B(-200,200),C(200,200,)D(200,-200)
//因爲設置順時針(順序就是 A -> D -> C -> B)所以B是最後的一個點
// path.setLastPoint(200,-300);所以現在的B座標是(200,-300)
//例子八
// canvas.translate(mCenterX,mCenterY);//移動到控件中心點
// canvas.scale(1,-1);//之前Y軸向下是正,現在Y軸向上是正
// Path path=new Path();
// Path src=new Path();
// path.addRect(-200,-200,200,200, Path.Direction.CW);
// src.addCircle(0,0,200, Path.Direction.CW);
// path.addPath(src,0,200);
// canvas.drawPath(path,mPaint);
//例子八總結: path.addPath(src,0,200);是src進行了位移之後再添加進當前path中
//例子九
// canvas.translate(mCenterX,mCenterY);
// canvas.scale(1,-1);//之前Y軸向下是正,現在Y軸向上是正
// Path path=new Path();
// path.lineTo(100,100);
// RectF rectF=new RectF(0,0,200,200);//確定一個矩形最少需要兩個點(對角線的兩個點)
// path.addArc(rectF,0,90);//逆時針爲正數
// canvas.drawPath(path,mPaint);
//例子九總結:兩次畫起點不一樣
//例子十
// canvas.translate(mCenterX,mCenterY);
// canvas.scale(1,-1);
// Path path=new Path();
// path.lineTo(100,100);
// RectF rectF=new RectF(0,0,300,300);
// path.arcTo(rectF,0,270);
// canvas.drawPath(path,mPaint);
//例子十總結:arcTo 添加一個圓弧到path,
// 如果圓弧的起點和上次最後一個座標點不相同,就連接兩個點
//例子十一
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.addRect(-200,-200,200,200, Path.Direction.CW);
//
// Path src=new Path();
// src.addCircle(0,0,200, Path.Direction.CW);
// path.set(src);
// canvas.drawPath(path,mPaint);
//例子十一總結: path.set(src);大致相當於 path = src;
//例子十二
// canvas.translate(mCenterX,mCenterY);
// Path path=new Path();
// path.addRect(-100,-100,100,100, Path.Direction.CW);
//
// Path dst=new Path();
// dst.addCircle(0,0,50, Path.Direction.CW);
//
// path.offset(50,0,dst);
// canvas.drawPath(dst,mPaint);
//例子十二:雖然我們在dst中添加了一個圓形形,但是並沒有表現出來,
// 所以,當dst中存在內容時,dst中原有的內容會被清空,而存放平移後的path。
}
}