Java Android TouchEvent:如何计算球将到达哪个坐标

Java Android TouchEvent:如何计算球将到达哪个坐标,java,android,user-interface,math,physics,Java,Android,User Interface,Math,Physics,我正在开发一个类似Facebook聊天头的应用程序 到目前为止,我实现了拖球和弹球,使球的位置反向一侧 i、 e.球在屏幕左50%,向右轻弹然后移动到右边缘,从右轻弹向左然后移动到左边缘 我的当前代码如下所示: Point initialPos = new Point(); PointF initialTouch = new PointF(); Point delta = new Point(); @Override public boolean onTouch(View v, Motio

我正在开发一个类似Facebook聊天头的应用程序

到目前为止,我实现了拖球和弹球,使球的位置反向一侧

i、 e.球在屏幕左50%,向右轻弹然后移动到右边缘,从右轻弹向左然后移动到左边缘

我的当前代码如下所示:

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;
}
点初始位置=新点();
PointF initialTouch=新的PointF();
点增量=新点();
@凌驾
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
初始位置集(mWindowParams.x,mWindowParams.y);
initialTouch.set(event.getRawX(),event.getRawY());
返回true;
case MotionEvent.ACTION\u UP:
int releaseX=(int)event.getRawX();
int releaseY=(int)event.getRawY();
行程[0]=mWindowParams.x;
行程[1]=mWindowParams.y;
如果(数学绝对值(delta.x)<(Dimension.screenX*0.15)和&数学绝对值(delta.y)>100){
行程[2]=0;
行程[3]=数学最小值(数学最大值(0,释放),底边);
}否则{
/*double rad=Math.atan2(initialTouch.y-releaseY,initialTouch.x-releaseY);
双度=(rad*180/Math.PI+180)%360*/
双斜率=(releaseY-initialTouch.y)/(releaseX-initialTouch.x);
双直线方程=初始位置y-初始位置x*斜率;
if(初始位置x
我使用斜率方程和直线方程,但不能处理所有情况

  • 试着弹到另一边,但在中间转回来(见图4)
  • 垂直flick(目前仅适用于有时,我猜只有y=0会起作用,可能需要调整敏感度?如果您不明白,可以尝试垂直flick FB messenger聊天头)
  • 请告诉我怎么做,我的数学很烂,非常感谢