Có, tôi cũng có cùng một sự cố không phải với TouchImageView.
Giải quyết được vấn đề những gì tôi đã làm đã tắt ViewPager khi chế độ xem của tôi đang lấy nét.
public class EnableDisableViewPager extends ViewPager {
private boolean enabled = true;
public EnableDisableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if(enabled)
return super.onInterceptTouchEvent(arg0);
return false;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
như vậy trong TouchImageView thi nghe của bạn để kích hoạt một sự kiện dù phóng to hoặc kéo.
đặt trình nghe cho đối tượng chế độ xem của bạn trong Hoạt động của bạn. Vì vậy, khi những sự kiện xảy ra chỉ cần vô hiệu hóa xem Pager.
Lưu ý: bạn cũng sẽ cần sự kiện di chuột để bật chế độ xem.
EDITED
này sẽ làm việc chỉ dành cho Phóng to, vì vậy cho ViewPager swipe trang bạn nên phóng to trở lại ban đầu.
Thêm các mã để TouchImageView bạn
public class TouchImageView extends ImageView {
...
private TouchEventListener touchEventListener;
private void sharedConstructing(Context context) {
...
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
...
case MotionEvent.ACTION_UP:
...
if(touchEventListener != null)
{
if(saveScale == 1.0)
touchEventListener.onZoomToOriginal();
else
touchEventListener.onZoom();
}
break;
...
}
...
}
});
}
...
public TouchEventListener getTouchEventListener() {
return touchEventListener;
}
public void setTouchEventListener(TouchEventListener touchEventListener) {
this.touchEventListener = touchEventListener;
}
public interface TouchEventListener
{
void onZoom();
void onZoomToOriginal();
}
}
giải pháp tốt hơn
Chúng ta có thể đạt được điều này mà không cần mở rộng ViewPager đến một lớp mới bằng cách sử dụng phương pháp đưa ra dưới đây.
requestDisallowInterceptTouchEvent(true);
Và với điều này chúng tôi có thể vuốt mà không cần phóng to vị trí ban đầu như chúng ta thấy trong Thư viện và nhiều ứng dụng khác.
public class TouchImageView extends ImageView {
...
private void stopInterceptEvent()
{
getParent().requestDisallowInterceptTouchEvent(true);
}
private void startInterceptEvent()
{
getParent().requestDisallowInterceptTouchEvent(false);
}
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
matrix.setTranslate(1f, 1f);
m = new float[9];
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
stopInterceptEvent();
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
if (scaleWidth < width) {
deltaX = 0;
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
} else if (scaleHeight < height) {
deltaY = 0;
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
} else {
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
}
if(deltaX == 0)
startInterceptEvent();
else
stopInterceptEvent();
matrix.postTranslate(deltaX, deltaY);
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
startInterceptEvent();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
setImageMatrix(matrix);
invalidate();
return true; // indicate event was handled
}
});
}
}
Ya hãy sửa lại TouchImageView. Tôi thực sự làm việc rất chăm chỉ. Tôi không thể tìm ra giải pháp. Nó sẽ thực sự hữu ích nếu bạn có thể giúp tôi trong đó !! Vui lòng cập nhật câu trả lời của bạn với TouchImageView đã sửa đổi. – Bharath
Tôi đã chỉnh sửa câu trả lời của mình bằng giải pháp. –
Cảm ơn bạn @Vivek. Làm việc của nó !! – Bharath