Tôi có Gallery
đầy đủ ImageView
s và ImageView
s có thể thu nhỏ và có thể dịch được. Mục tiêu của tôi là khi ImageView
không còn có thể dịch sang trái/phải, Gallery
sẽ cuộn. Vì vậy, đôi khi cần ImageView
sự kiện cảm ứng, đôi khi cần Gallery
sự kiện cảm ứng. Tôi có logic trong phương thức onTouchEvent
của mình khi tôi muốn bắt tay, nhưng tôi nhận được kết quả không mong muốn. Tôi sẽ giải thích vấn đề sau khi tôi hiển thị mã của mình:Tuyên bố sự kiện chạm cảm ứng vụng về giữa các chế độ xem
// 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;
}
Và đây là số Gallery
của tôi. Tôi ghi đè onTouchEvent
chỉ để hiển thị khi nhận được sự kiện chạm.
// SwipeGallery.java
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("SwipeGallery", "IM GETTING TOUCHED!");
return super.onTouchEvent(event);
}
Vì vậy, khi tôi tải lên hoạt động, tôi cố gắng vuốt từ phải sang trái. Logic để truyền thông qua sự kiện chuyển động được kích hoạt ngay lập tức, nhưng đây là đầu ra bản ghi của tôi.
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.
lần thứ hai tôi vuốt phải sang trái, tôi có được điều này:
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!
mô hình này của "sự kiện chuyển động 1st các ImageView luôn xử lý, sự kiện chuyển động 2 bộ sưu tập luôn xử lý" tiếp tục mãi mãi (Số lần xem hình ảnh mới được thực hiện cho từng vị trí trong thư viện, đó là lý do tại sao isPassThroughTouchEvent()
trả về sai thời gian thứ 3, thứ 5, v.v ...). Vì vậy, chính xác những gì tôi đang thiếu ở đây? Tôi nghĩ trở về sai sẽ tuyên truyền các sự kiện liên lạc cho đến khi nó được xử lý, nhưng Gallery
sẽ không mang nó lần đầu tiên, nhưng nó làm thứ hai? Điều này không có nghĩa gì với tôi. Ai có ý tưởng gì không? Cảm ơn.
Bạn đã thử clearFocus() trên thư viện chưa? – bgs
Tôi muốn giữ cho nó một cách tiếp cận từ dưới lên, nơi 'ImageView' và' Gallery' không biết rằng nó tồn tại và không cần. Hơn nữa, bất kỳ hành động nào được thực hiện trên 'Thư viện' sẽ không ảnh hưởng đến kết quả vuốt đầu tiên của tôi khi' Thư viện' không bao giờ nhận được bất kỳ sự kiện chạm nào. –
Tôi là curios làm thế nào để giải quyết điều này, WhatPassThroughTouchEvent() trông như thế nào? – bgs