Android學習筆記--Path基本操作

筆記參考自安卓自定義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。
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章