You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:39:02