我在屏幕上绘制了一个虚拟标尺。我希望能够在成长的矩形内发生触摸事件时绘制像上面蓝线那样的直线。但由于触摸不能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.当标尺是水平的时它工作正常然后从水平转向垂直时开始表现得非常奇怪。我不知道如何实现这一目标。请帮忙!谢谢。
答案 0 :(得分: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)绘制你的行,实际上并不重要哪个是开始,哪个是结束