笔记参考自安卓自定义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。
}
}