Java Android onTouch方向

时间:2016-06-18 21:02:07

标签: java android swipe ontouch

我正在尝试开发一个简单的游戏,我需要扔一颗子弹。 我希望球跟着触摸或滑动方向。

但是,我有一个小问题,我没有成功解决。

我在LRESULT CMainFrame::OnCheckClipboard( WPARAM wparam, LPARAM lparam ) { std::string data( GetClipboardStr( ) ); std::string::size_type end_cnt= data.find( "\r\n" ); if( end_cnt == std::string::npos ) bClipboardHasValidRecords= false; else { auto header_end= data.begin( ) + end_cnt; csv_vect_t header; split( header, str_it_range_t( data.begin( ), header_end ), boost::is_any_of("\t") ); bClipboardHasValidRecords= header.size( ) == RARECORD_SIZE; } return TRUE; } 的{​​{1}}和ACTION_DOWN MotionEvent上的坐标,然后计算直线方程,以便根据ACTION_UP移动球这条直线。

问题在于,当我向接近"向上"的方向滑动时或"转发"或者"在"前面,球以闪电般的速度移动,而在更偏斜(右或左)或对角线的另一个方向上,球以正常速度移动。

我计算中的缺陷在哪里?

请帮助我,我离结果不远,但需要你来解决这个问题!

MotionEvent方法:

onTouch

这是我的public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()) { case(MotionEvent.ACTION_DOWN): balle.setX(event.getX()); balle.setY(event.getY()); ya = event.getY(); xa = event.getX(); break; case(MotionEvent.ACTION_UP): xb = event.getX(); yb = event.getY(); balle.setMove(true); break; } return true; } 方法:

moveDirection

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我看到你没有抓住所有的事件,所以也许来自Android文档的de VelocityTracker api的代码可能有所帮助,在这个例子中,当你拉下手指时,会创建一个新的跟踪器,当你移动时(任何方向)你捕捉事件的速度,我认为你可以根据触摸的速度和方向移动球。

public class MainActivity extends Activity {
private static final String DEBUG_TAG = "Velocity";
    ...
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
    int index = event.getActionIndex();
    int action = event.getActionMasked();
    int pointerId = event.getPointerId(index);

    switch(action) {
        case MotionEvent.ACTION_DOWN:
            if(mVelocityTracker == null) {
                // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                mVelocityTracker = VelocityTracker.obtain();
            }
            else {
                // Reset the velocity tracker back to its initial state.
                mVelocityTracker.clear();
            }
            // Add a user's movement to the tracker.
            mVelocityTracker.addMovement(event);
            break;
        case MotionEvent.ACTION_MOVE:
            mVelocityTracker.addMovement(event);
            // When you want to determine the velocity, call 
            // computeCurrentVelocity(). Then call getXVelocity() 
            // and getYVelocity() to retrieve the velocity for each pointer ID. 
            mVelocityTracker.computeCurrentVelocity(1000);
            // Log velocity of pixels per second
            // Best practice to use VelocityTrackerCompat where possible.
            Log.d("", "X velocity: " + 
                    VelocityTrackerCompat.getXVelocity(mVelocityTracker, 
                    pointerId));
            Log.d("", "Y velocity: " + 
                    VelocityTrackerCompat.getYVelocity(mVelocityTracker,
                    pointerId));
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            // Return a VelocityTracker object back to be re-used by others.
            mVelocityTracker.recycle();
            break;
    }
    return true;
}
}

doc的链接。