android path 画星星

使用 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;
        }
    }
}

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值