我需要在自定义视图的onuch方法中进行单边触摸检测.我尝试在ACTION-DOWN和ACTION-UP中获取x和y值,而在ACTION-UP中我给出的条件是,如果ACTIONDOWN和ACTION-UP中的X和Y的值相等,则将其作为单次点击.
我的代码如下
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (!mSupportsZoom && !mSupportsPan) return false;
- mScaleDetector.onTouchEvent(ev);
- final int action = ev.getAction();
- switch (action & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN: {
- final float x = ev.getX();
- final float y = ev.getY();
- mLastTouchX = x; //here i get x and y values in action down
- mLastTouchY = y;
- mActivePointerId = ev.getPointerId(0);
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- final int pointerIndex = ev.findPointerIndex(mActivePointerId);
- final float x = ev.getX(pointerIndex);
- final float y = ev.getY(pointerIndex);
- if (mSupportsPan && !mScaleDetector.isInProgress()) {
- final float dx = x - mLastTouchX;
- final float dy = y - mLastTouchY;
- mPosX += dx;
- mPosY += dy;
- //mFocusX = mPosX;
- //mFocusY = mPosY;
- invalidate();
- }
- mLastTouchX = x;
- mLastTouchY = y;
- break;
- }
- case MotionEvent.ACTION_UP: {
- final float x = ev.getX();
- final float y = ev.getY();
- touchupX=x; //here is get x and y values at action up
- touchupY=y;
- if(mLastTouchX == touchupX && mLastTouchY == touchupY){ //my condition if both the x and y values are same .
- PinchZoomPanActivity2.tapped1(this.getContext(),100); //my method if the singletap is detected
- }
- else{
- }
- mActivePointerId = INVALID_POINTER_ID;
- break;
- }
- case MotionEvent.ACTION_CANCEL: {
- mActivePointerId = INVALID_POINTER_ID;
- break;
- }
- case MotionEvent.ACTION_POINTER_UP: {
- final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
- >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
- final int pointerId = ev.getPointerId(pointerIndex);
- if (pointerId == mActivePointerId) {
- final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
- mLastTouchX = ev.getX(newPointerIndex);
- mLastTouchY = ev.getY(newPointerIndex);
- mActivePointerId = ev.getPointerId(newPointerIndex);
- }
- break;
- }
- }
- return true;
- }
但我不能完成.我的意思是在每一个动作,我的方法被称为.即使动作和动作的x和y值都不相同.我想我也需要把一些范围放在单边,我们用手指触摸屏幕.有人可以给我一些建议吗
解决方法
最近我也遇到了同样的问题,最终不得不实施去抖动来使其工作.这不是理想的,但它是非常可靠的,直到我能找到更好的东西.
View.onClickListener对我来说更可靠,但不幸的是,我需要OnTouchListener的MotionEvent.
- class CustomView extends View {
- private static long mDeBounce = 0;
- static OnTouchListener listenerMotionEvent = new OnTouchListener() {
- @Override
- public boolean onTouch(View view,MotionEvent motionEvent) {
- if ( Math.abs(mDeBounce - motionEvent.getEventTime()) < 250) {
- //Ignore if it's been less then 250ms since
- //the item was last clicked
- return true;
- }
- int intCurrentY = Math.round(motionEvent.getY());
- int intCurrentX = Math.round(motionEvent.getX());
- int intStartY = motionEvent.getHistorySize() > 0 ? Math.round(motionEvent.getHistoricalY(0)) : intCurrentY;
- int intStartX = motionEvent.getHistorySize() > 0 ? Math.round(motionEvent.getHistoricalX(0)) : intCurrentX;
- if ( (motionEvent.getAction() == MotionEvent.ACTION_UP) && (Math.abs(intCurrentX - intStartX) < 3) && (Math.abs(intCurrentY - intStartY) < 3) ) {
- if ( mDeBounce > motionEvent.getDownTime() ) {
- //Still got occasional duplicates without this
- return true;
- }
- //Handle the click
- mDeBounce = motionEvent.getEventTime();
- return true;
- }
- return false;
- }
- };
- }