如何在onTouchEvent中计算Paint绘制线条的长度与偏转角度
前置准备
你需要先在自定义View中声明两个成员变量存储绘制线条的起止坐标,Paint仅负责保存绘制样式(颜色、粗细等),不会存储绘制路径的坐标信息,无法直接从Paint实例中获取线条相关数据:
// 存储线条起点、终点坐标 private PointF mLineStart = new PointF(); private PointF mLineEnd = new PointF();
在onTouchEvent中更新坐标值:
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 按下时记录起点 mLineStart.set(event.getX(), event.getY()); return true; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: // 滑动/抬起时更新终点,重绘 mLineEnd.set(event.getX(), event.getY()); invalidate(); break; } return super.onTouchEvent(event); }
1. 计算线条长度
通过两点间距离公式即可计算,直接调用系统封装的Math.hypot方法即可,比手动计算平方和开平方精度更高:
float dx = mLineEnd.x - mLineStart.x; float dy = mLineEnd.y - mLineStart.y; // 得到的lineLength单位和坐标单位一致,为像素 float lineLength = (float) Math.hypot(dx, dy);
2. 计算线条偏转角度
首先注意Android View的坐标系规则:左上角为原点,X轴向右为正方向,Y轴向下为正方向,和常规数学坐标系Y轴方向相反。
如果需要计算线条与水平向右(X轴正方向)的夹角,可通过Math.atan2方法计算后转角度单位:
float dx = mLineEnd.x - mLineStart.x; float dy = mLineEnd.y - mLineStart.y; // 计算得到弧度值后转角度,取值范围为[-180, 180] float angle = (float) Math.toDegrees(Math.atan2(dy, dx)); // 如果需要转为0~360的正角度,可添加以下逻辑 if (angle < 0) { angle += 360; }
参考角度示意图:
如果需要计算和竖直方向的夹角,可基于上述结果调整即可,比如和竖直向下的夹角为 90 - angle。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

