Android自定义View无线手尺

package com.example.awesome;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.google.gson.Gson;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


public class MyAwesimeView extends View {
    private static final double TICK_DIST = 180;
    private Paint ruler = new Paint();
    private static final int z = 24;
    private static Boolean flag = true;
    // 用于判断第2个手指是否存在
    boolean haveSecondPoint = false;
    // 记录第2个手指第位置
    PointF point = new PointF(0, 0);
    PointF point1 = new PointF(0, 0);
    private Paint mRulerPaint;
    private Paint mLinePaint;
    int radu=250;
    private int width;
    private Context context;


    private float[] mPts;
    private static final float SIZE = 900;
    private static final int SEGS = 100;
    private static final int X = 0;
    private static final int Y = 1;
    public MyAwesimeView(Context context) {
        super(context);
        this.context=context;
        init();
        buildPoints();
    }

    private void init() {
        ruler.setColor(Color.BLACK);
        ruler.setStrokeWidth(20f);
        ruler.setAntiAlias(true);
        ruler.setStyle(Paint.Style.FILL); //设置填充样式


        mLinePaint = new Paint();
        mLinePaint.setColor(getResources().getColor(R.color.trans));
        //抗锯齿
        mLinePaint.setAntiAlias(true);
        mLinePaint.setStyle(Paint.Style.STROKE);
        mLinePaint.setStrokeWidth(20);



        mRulerPaint = new Paint();
        mRulerPaint.setAntiAlias(true);
        mRulerPaint.setStyle(Paint.Style.FILL);
        mRulerPaint.setColor(getResources().getColor(R.color.blue_black));
        mRulerPaint.setStrokeWidth(25);




    }

    public MyAwesimeView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
        buildPoints();
    }

    public MyAwesimeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
        buildPoints();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        //使用Canvas绘图
        //画布移动到(10,10)位置
        canvas.translate(10, 10);
        canvas.drawColor(Color.WHITE);
        //创建红色画笔,使用单像素宽度,绘制直线
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(0);
        canvas.drawLines(mPts, paint);
        //创建蓝色画笔,宽度为3,绘制相关点
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(3);
        canvas.drawPoints(mPts, paint);
        //创建Path, 并沿着path显示文字信息
        RectF rect = new RectF(10, 300, 290, 430);
        Path path = new Path();
        path.addArc(rect, -180, 180);
        paint.setTextSize(18);
        paint.setColor(Color.BLUE);

        if (haveSecondPoint) {
//            canvas.drawCircle(point.x, point.y, 80, ruler);
//            canvas.drawCircle(point1.x, point1.y, 80, ruler);

            Log.d("TAG",""+getWidth()+"            "+getHeight());
            Log.d("TAG",""+point1.x+"   "+point1.y+"            "+point.x+"    "+point.y);
            canvas.drawLine(point1.x,point1.y,point.x,point.y,mLinePaint);



            List<PointF> main = main(new PointF(point1.x, point1.y), new PointF(point.x, point.y));
            ruler.setTextSize(26);
            ruler.setStrokeWidth(20);
            for (int i = 0; i <main.size() ; i++) {
                canvas.drawText(i+1+"",main.get(i).x,main.get(i).y,ruler);
            }


        }




    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int index = event.getActionIndex();
        int x=(int) event.getX();
        int y=(int) event.getY();
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_POINTER_DOWN:
                // 判断是否是第2个手指按下
                if (event.getPointerId(index) == 1){
                    haveSecondPoint = true;
                    point.set(event.getY(), event.getX());
                }
                break;
            case MotionEvent.ACTION_POINTER_UP:
                // 判断抬起的手指是否是第2个
                haveSecondPoint = false;
                List<LatLng> listitme=new ArrayList<>();
                listitme.add(new LatLng(point.x,point.y));
                listitme.add(new LatLng(point1.x,point1.y));

                point.set(0, 0);
                point1.set(0,0);
                break;
            case MotionEvent.ACTION_MOVE:
                if (haveSecondPoint) {
                    // 通过 pointerId 来获取 pointerIndex
                    int pointerIndex = event.findPointerIndex(1);
                    // 通过 pointerIndex 来取出对应的坐标
                    point.set(event.getX(pointerIndex), event.getY(pointerIndex));
                    int pointerIndex1 = event.findPointerIndex(0);
                    point1.set(event.getX(pointerIndex1), event.getY(pointerIndex1));
                }


                break;

        }


        invalidate();

        return true;



    }

    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
     int  height = View.MeasureSpec.getSize(heightMeasureSpec);
        width = MeasureSpec.getSize(widthMeasureSpec);
        setMeasuredDimension(width,height);  //这里面是原始的大小,需要重新计算可以修改本行

    }


    public  List<PointF> main(PointF point1,PointF point2) {
        List<PointF> points = new ArrayList<>();

        double dx = point2.x - point1.x,
                dy = point2.y - point1.y;
        double len = Math.sqrt(dx * dx + dy * dy);
        double k = TICK_DIST / len;


        float x = point1.x;
        float y = point1.y;
        for (int i = 0; i < len; i += TICK_DIST) {
            points.add(new PointF(x, y));
            x += dx * k;
            y += dy * k;
        }
        points.add(point2);
     return points;
    }

    private void buildPoints() {
        //生成一系列点
        final int ptCount = (SEGS + 1) * 2;
        mPts = new float[ptCount * 2];
        float value = 0;
        final float delta = SIZE / SEGS;
        for (int i = 0; i <= SEGS; i++) {
            mPts[i * 4 + X] = SIZE - value;
            mPts[i * 4 + Y] = 0;
            mPts[i * 4 + X + 2] = 0;
            mPts[i * 4 + Y + 2] = value;
            value += delta;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想不上班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值