【问题标题】:how to find the biggest possible Y point given X in Region in Android?如何在Android的Region中找到给定X的最大可能Y点?
【发布时间】:2017-03-19 21:49:08
【问题描述】:

我在屏幕上绘制了一个虚拟标尺。当触摸事件发生在生长的矩形内时,我希望能够像上面的蓝线一样绘制一条直线。但由于触摸不能 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。当标尺水平时它工作正常,然后从水平转向垂直时开始表现得很奇怪。我不知道如何做到这一点。请帮忙!谢谢。

【问题讨论】:

  • 我不确定我是否理解这个问题,你得到了在那个棕色矩形内的触摸坐标,然后你想画一条从那里经过并且平行于标尺的线..?
  • @lelloman 是的!这是正确的,但是由于移动事件可能像红线一样发生,我如何绘制与标尺平行的蓝线?

标签: android android-canvas android-graphics


【解决方案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) 画线,实际上哪个是开始哪个是结束并不重要

【讨论】:

  • 我不明白在哪里可以插入用户触摸的 x,y 点?
  • 对,我发布的代码是在图片中绘制蓝线,其中心位于棕色矩形的中心。你想让线条的中心与触摸相对应吗?
  • 假设我有标尺的宽度和高度。是否可以在标尺图像的正上方绘制蓝线?
  • 棕色 Rect 只是用来提供一些容忍度,因为人类不可能触摸直线。棕色矩形的中心不必位于标尺的正上方
  • 是的,你可以把它画在标尺上,我发布的代码将使用 mRulerCenter x 和 y 作为线的中心,因为这是你旋转标尺的点,你可以选择另一个如果您愿意,请点
猜你喜欢
  • 2019-02-07
  • 2023-01-14
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多