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:664215432@qq.com
 */

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。
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值