我在我的应用程序中添加了一个drawable,我可以通过触摸移动并根据手指移动速度,我想做不同的操作。
我检查了事件,我只能使用MotionEvent.ACTION_MOVE来检测是否有移动。所以我保存了最后一个动作的时间戳并得到了实际值,我计算了移动的增量距离并使用公式
速度=距离/时间
然而,速度值显示各种数字,从0到aprox。 6但是如果我慢慢地或快速地使用我的手指并不重要。我应该修改什么才能获得触摸移动的速度?
我使用以下代码:
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
final int X = (int) motionEvent.getRawX();
final int Y = (int) motionEvent.getRawY();
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
oldTimeStamp=System.currentTimeMillis();
break;
case MotionEvent.ACTION_UP:
speed=0;
textView.setText("speed: " + speed);
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
timeStamp= System.currentTimeMillis();
long diff=timeStamp-oldTimeStamp;
double dist=Math.sqrt(Math.pow(_xDelta,2)+Math.pow(_yDelta,2));
double speed=dist/diff;
textView.setText("speed: " + speed);
oldTimeStamp=timeStamp;
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
view.setLayoutParams(layoutParams);
break;
}
layoutRoot.invalidate();
return true;
}
答案 0 :(得分:5)
@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;
}