我有一个Gallery
完整的ImageView
s,ImageView
s 是可缩放和可翻译的。我的目标是,一旦ImageView
不能再向左/向右翻译,Gallery
就会滚动。所以有时ImageView
需要处理触摸事件,有时Gallery
需要处理触摸事件。我在我ImageView
的onTouchEvent
方法中有逻辑,当我希望切换发生时,但我得到了意想不到的结果。在我显示我的代码后,我将解释这个问题:
// PinchZoomImageView.java
@Override
public boolean onTouchEvent( MotionEvent event ) {
Log.i( "PinchZoomImageView", "IM GETTING TOUCHED!" );
if ( isPassThroughTouchEvent() ) {
Log.i( "PinchZoomImageView", "IM RETURNING FALSE!" );
return false;
}
getScaleDetector().onTouchEvent( event );
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = event.getX();
final float y = event.getY();
setLastTouchX( x );
setLastTouchY( y );
setActivePointerId( event.getPointerId( 0 ) );
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = event.findPointerIndex( getActivePointerId() );
final float x = event.getX( pointerIndex );
final float y = event.getY( pointerIndex );
// Only move if the ScaleGestureDetector isn't processing a gesture.
if ( !getScaleDetector().isInProgress() ) {
if ( isDetectMovementX() ) {
final float dx = x - getLastTouchX();
setPosX( getPosX() + dx );
}
if ( isDetectMovementY() ) {
final float dy = y - getLastTouchY();
setPosY( getPosY() + dy );
}
invalidate();
}
setLastTouchX( x );
setLastTouchY( y );
if ( isAtXBound() && !isPassThroughTouchEvent() ) {
setPassThroughTouchEvent( true );
}
break;
}
case MotionEvent.ACTION_UP: {
setActivePointerId( INVALID_POINTER_ID );
break;
}
case MotionEvent.ACTION_CANCEL: {
setActivePointerId( INVALID_POINTER_ID );
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = ( event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK ) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = event.getPointerId( pointerIndex );
if ( pointerId == getActivePointerId() ) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
setLastTouchX( event.getX( newPointerIndex ) );
setLastTouchY( event.getY( newPointerIndex ) );
setActivePointerId( event.getPointerId( newPointerIndex ) );
}
break;
}
}
return true;
}
这是我的Gallery
. 我重写onTouchEvent
只是为了显示它何时接收到触摸事件。
// SwipeGallery.java
@Override
public boolean onTouchEvent( MotionEvent event ) {
Log.i( "SwipeGallery", "IM GETTING TOUCHED!" );
return super.onTouchEvent( event );
}
因此,当我加载活动时,我尝试从右向左滑动。传递运动事件的逻辑会立即触发,但这是我的日志输出。
08-02 10:04:47.097: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.245: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.245: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.261: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.261: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.277: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.277: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.296: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.296: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.312: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.312: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.327: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.327: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.343: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.343: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:04:47.360: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:04:47.360: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
....etc.
我第二次从右向左滑动,我得到了这个:
08-02 10:27:31.573: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED!
08-02 10:27:31.573: INFO/PinchZoomImageView(17189): IM RETURNING FALSE!
08-02 10:27:31.573: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.636: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.636: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.683: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.933: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.964: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:31.999: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
08-02 10:27:32.034: INFO/SwipeGallery(17189): IM GETTING TOUCHED!
这种“图像视图始终处理的第一个运动事件,画廊始终处理的第二个运动事件”的模式将永远持续下去(为画廊中的每个位置制作一个新的图像视图,这就是为什么isPassThroughTouchEvent()
在第 3 次、第 5 次等时间返回 false 的原因)。那么我到底错过了什么?我认为返回 false 会传播触摸事件,直到它被处理,但Gallery
第一次不会接受它,但第二次呢?这对我来说毫无意义。有人有想法么?谢谢。