Java Android TouchEvent:如何计算球将到达哪个坐标
我正在开发一个类似Facebook聊天头的应用程序 到目前为止,我实现了拖球和弹球,使球的位置反向一侧 i、 e.球在屏幕左50%,向右轻弹然后移动到右边缘,从右轻弹向左然后移动到左边缘 我的当前代码如下所示: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
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
我使用斜率方程和直线方程,但不能处理所有情况