使用 path 画星星,刚开始我也是像大家一样去百度一下,学习了一下各位大佬如何画星星,根据下面这套理论我就敲代码了,花了点时间,也能做出了效果

代码长是长了点,然而有个问题,大家是否有共鸣,你的PM 假如有天把 A 不是正对着上面的
又或者是这样的===》 
你的代码用不用大改动???
思考:A点是可以改变位置,但是不论怎么改变,A、B、C、D、F 这5各点的距离仍然是一样的
结论:所以我们只要只到某个开始点(A) 的位置,根据 android 提供的 PathMeasure 测量工具 去计算 其他点的位置

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* @author : Lambert
* date : 2021/3/9 4:02 PM
* 使用 PathMeasure 测量工具画星星
*/
public class StarPathView extends View {
int mViewWidth;
int mViewHeight;
int pointX = 0;
int pointY = 0;
//内间距
int padding = 20;
Paint mPaintLine;
Path mPath;
int startCount = 5;
//5个点位置
public List<MyPoint> pointList = new ArrayList<>();
public StarPathView(Context context) {
super(context, null);
}
public StarPathView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView();
}
private void initView() {
mPath = new Path();
mPaintLine = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaintLine.setStrokeWidth(2);
mPaintLine.setStyle(Paint.Style.STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mViewWidth = getWidth();
mViewHeight = getHeight();
pointX = (mViewWidth - padding*2) / 2;
pointY = (mViewHeight - padding*2) / 2;
canvas.drawPath(mPath,mPaintLine);
//得到点
getPoint();
//绘制点
drawStar(canvas);
}
private void getPoint(){
//得到一个矩形 rectF
RectF rectF = new RectF(0+padding, 0+padding, mViewHeight-padding, mViewWidth -padding);
//开始点的角度可以随意改动
int startAngle = 270;
int sweepAngle = 360;
mPath.addArc(rectF,startAngle,sweepAngle);
PathMeasure pathMeasure = new PathMeasure(mPath,false);
for(int i = 0 ;i<startCount;i++){
float[] pos = new float[2];
//得到距离
int distance = (int)(i * pathMeasure.getLength()/ startCount);
//根据 距离得到 x,y
pathMeasure.getPosTan(distance,pos,null);
MyPoint point =new MyPoint(pos[0],pos[1]);
pointList.add(point);
}
}
private void drawStar(Canvas canvas){
MyPoint point1 = pointList.get(0);
MyPoint point2 = pointList.get(1);
MyPoint point3 = pointList.get(2);
MyPoint point4 = pointList.get(3);
MyPoint point5 = pointList.get(4);
//绘制点与点的线,连城五角星
canvas.drawLine(point1.x,point1.y,point3.x,point3.y,mPaintLine);
canvas.drawLine(point1.x,point1.y,point4.x,point4.y,mPaintLine);
canvas.drawLine(point2.x,point2.y,point4.x,point4.y,mPaintLine);
canvas.drawLine(point2.x,point2.y,point5.x,point5.y,mPaintLine);
canvas.drawLine(point3.x,point3.y,point5.x,point5.y,mPaintLine);
}
private class MyPoint{
public int x,y;
public MyPoint(float x,float y){
this.x = (int)x;
this.y = (int)y;
}
}
}

1444





