Tôi đang gặp vấn đề tương tự described here, ngoại trừ thay vì sử dụng ScaleAnimation, tôi cho phép phóng to/thu nhỏ pin trong RelativeLayout của mình.Vải chia tỷ lệ/chuyển đổi của Android không sửa đổi vùng có thể nhấp
Thu phóng/thu phóng hoạt động hoàn hảo, nhưng bất kể tầm nhìn của tôi được quét/thu phóng như thế nào, khu vực có thể nhấp không thay đổi cùng với biểu diễn trực quan. Đây là những gì dispatchTouchEvent của tôi trông giống như:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mScaleGestureDetector != null && mGestureDetector != null) {
mScaleGestureDetector.onTouchEvent(ev);
mGestureDetector.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;
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);
// Only move if the ScaleGestureDetector isn't processing a gesture.
if (!mScaleGestureDetector.isInProgress() && mScaleFactor > 1f) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
float newPosX = mPosX + dx;
float newPosY = mPosY + dy;
if (isCoordinateInBound(newPosX, mScreenSize.x))
mPosX = newPosX;
if (isCoordinateInBound(newPosY, mScreenSize.y))
mPosY = newPosY;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
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 super.dispatchTouchEvent(ev);
}
và dispatchDraw tôi:
protected void dispatchDraw(Canvas canvas) {
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
super.dispatchDraw(canvas);
canvas.restore();
}
Làm thế nào để bạn chỉnh sửa các vùng có thể nhấp phù hợp để điều chỉnh quy mô/chuyển đổi của vải?
Với giải pháp này, điều này có nghĩa là tôi cần kiểm tra mọi chế độ xem tương tác trên bố cục của mình (Button, edittext, v.v ...)? Điều đó có vẻ không hiệu quả. – l46kok
@ l46kok Có tôi biết. Đó là giá phải trả nếu bạn muốn xử lý việc gửi các sự kiện liên lạc theo cách thủ công :) – bonnyz