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;
}
}
}
Android自定义View无线手尺
于 2022-06-02 14:13:31 首次发布