Android Touch事件:如何计算到达球的坐标

时间:2015-01-22 10:44:18

标签: java android user-interface math physics

我正在开发像Facebook的Chat Head这样的应用程序

到目前为止,我实现了拖拽和轻弹球,以反转球的位置

即。屏幕上的球离开50%,向右轻弹然后向右边移动,从右边轻弹然后移动到左边缘

Pic 1 Pic 2

我目前的代码如下所示:

Point initialPos = new Point();
PointF initialTouch = new PointF();
Point delta = new Point();

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            initialPos.set(mWindowParams.x, mWindowParams.y);
            initialTouch.set(event.getRawX(), event.getRawY());
            return true;
        case MotionEvent.ACTION_UP:
            int releaseX = (int)event.getRawX();
            int releaseY = (int)event.getRawY();

            travel[0] = mWindowParams.x;
            travel[1] = mWindowParams.y;
            if (Math.abs(delta.x) < (Dimension.screenX * 0.15) && Math.abs(delta.y) > 100) {
                travel[2] = 0;
                travel[3] = Math.min(Math.max(0, releaseY), bottomEdge);
            } else {
                /*double rad = Math.atan2(initialTouch.y - releaseY, initialTouch.x - releaseY);
                double degree = (rad * 180 / Math.PI + 180) % 360;*/
                double slope = (releaseY - initialTouch.y) / (releaseX - initialTouch.x);
                double straightLineEquation = initialPos.y - initialPos.x * slope;

                if (initialPos.x < Dimension.screenX / 2) {
                    // flick right
                    int destY = (int) (Dimension.screenX * slope + straightLineEquation);
                    travel[2] = Dimension.screenX - mBall.getWidth();
                    travel[3] = Math.min(Math.max(0, destY), bottomEdge);
                } else {
                    // flick left
                    travel[2] = 0;
                    travel[3] = Math.min(Math.max(0, (int) straightLineEquation), bottomEdge);
                }
            }
            moveBallToPos(travel);
            return true;
        case MotionEvent.ACTION_MOVE:
            delta.set((int) (event.getRawX() - initialTouch.x), (int) (event.getRawY() - initialTouch.y));
            mWindowParams.x = initialPos.x + delta.x;
            mWindowParams.y = initialPos.y + delta.y;
            mWindowManager.updateViewLayout(mBall, mWindowParams);
            return true;
    }
    return false;
}

我使用斜率方程和直线方程,但不处理所有情况..

  1. 尝试向另一侧轻弹,但在中间转回(参见图4)
  2. 垂直轻弹(目前只在有效时工作,我的猜测只有y = 0会起作用,可能需要调整灵敏度?如果你不明白那么你可以尝试垂直轻弹FB信使聊天头)
  3. Pic 3 Pic 4

    请告诉我如何做到这一点,我的数学很糟糕,非常感谢!

0 个答案:

没有答案