1

在此处输入图像描述

我在屏幕上绘制了一个虚拟标尺。当触摸事件发生在生长的矩形内时,我希望能够像上面的蓝线一样绘制一条直线。但由于触摸不能 100% 笔直,因此运动可能会像红线一样。这就是为什么我设置一个矩形来监听所有附近的触摸事件,然后画一条蓝线。

我目前有

mRulerRect.set(mRulerCenter.x - mRulerBitmap.getWidth() / 2,
                mRulerCenter.y - mRulerBitmap.getHeight()),
                mRulerCenter.x + mRulerBitmap.getWidth() / 2,
                mRulerCenter.y);
mPath.addRect(mRulerRect, Path.Direction.CCW);
mRulerMatrix.setRotate(mRulerAngle, mRulerCenter.x, mRulerCenter.y);
mPath.transform(mRulerMatrix);
mRegions.setPath(mPath, new Region(mRulerRect));

然后我检查触摸是否发生在棕色矩形内mRegions.contains(x,y)。到目前为止,它非常适合触摸检测,但我现在遇到的问题是如何画一条直线。我尝试修复 X ​​点然后计算 Y。当标尺水平时它工作正常,然后从水平转向垂直时开始表现得很奇怪。我不知道如何做到这一点。请帮忙!谢谢你。

4

1 回答 1

1

你知道的事情:

  • 那个棕色矩形的中心是mRulerCenter.x, mRulerCenter.y
  • 您要绘制的线通过该点
  • 线的角度是mRulerAngle

我们只缺少一个元素,即我们要绘制的线的长度。这可能是尺子宽度的一部分,应该很容易计算mRulerRect.width() * someFactor

现在,我们想知道线的开始和结束是什么,我们可以用三角函数来计算

float halfLineLength = mRulerRect.width() * someFactor;
float startAngle = (float) Math.toRadians(mRulerAngle);
float endAngle = (float) Math.toRadians(mRulerAngle + 180);

float startX = mRulerCenter.x + (float) Math.cos(startAngle) * halfLineLength;
float startY = mRulerCenter.y + (float) Math.sin(startAngle) * halfLineLength;

float endX = mRulerCenter.x + (float) Math.cos(endAngle) * halfLineLength;
float endY = mRulerCenter.y + (float) Math.sin(endAngle) * halfLineLength;

然后从(startX,startY)到(endX,endY)画线,实际上哪个是开始哪个是结束并不重要

于 2017-03-20T06:38:13.570 回答