2015-05-04 18 views
13

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?

Trả lời

9

Vì bạn đã onverriding dispatchTouchEvent, bạn có thể thử này:

  1. tự đánh giá từng MotionEvent bằng cách xem xét zoom/chuyển đổi pan hiện hành; bạn có thể tạo một mớiMotionEvent (chúng ta hãy gọi nó FakeMotionEvent) bằng cách áp dụng zoom ngược/chảo chuyển đổi với bản gốc MotionEventm.
  2. Kiểm tra nếu FakeMotionEventchặn một cụ Viewv; điều này có nghĩa là người dùng đang chạm vào vị trí thể hiện vị trí hiển thị của người dùng là v.
  3. Nếu FakeMotionEvent chặn v, tiêu thụ dòng điện MotionEvent và gọi v.dispatchTouchEvent(m);

TIP: Bạn có thể sử dụng phương pháp dưới đây để đánh giá xem một MotionEvent chặn một View với một mức độ nhất định của sự khoan dung:

private boolean intercept(MotionEvent ev, View view, float boundingBoxTolerance){ 
    if (boundingBoxTolerance < 1.0f) { 
     boundingBoxTolerance = 1.0f; 
    } 
    try { 
     if (ev != null && view != null) { 
      int coords[] = new int[2]; 
      view.getLocationOnScreen(coords); 
      if (ev.getRawX() >= ((float)coords[0])/boundingBoxTolerance && ev.getRawX() <= coords[0] + ((float) view.getWidth()) * boundingBoxTolerance) { 
       if(ev.getRawY() >= ((float)coords[1])/boundingBoxTolerance && ev.getRawY() <= coords[1] + ((float) view.getHeight()) * boundingBoxTolerance) 
        return true; 
      } 
     } 
    } 
    catch (Exception e) {} 
    return false; 
} 
+1

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

+1

@ 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

0

Tôi đoán bạn đang sử dụng View Animations, tôi sẽ thích sử dụng Property animations thay

đoạn trích từ tài liệu Android (xem nhấn mạnh)

Hệ thống xem phim hoạt hình cung cấp khả năng để chỉ động Xem đối tượng, vì vậy nếu bạn muốn để animate-View phi vật thể, bạn phải triển khai mã của riêng bạn để làm như vậy. Hệ thống hoạt hình xem cũng là bị hạn chế trong thực tế là nó chỉ phơi bày một vài khía cạnh của đối tượng View để tạo hoạt ảnh, chẳng hạn như tỷ lệ và xoay của Chế độ xem nhưng không phải là màu nền của ví dụ.

Một bất lợi khác của hệ thống hoạt ảnh ở chế độ xem là chỉ được sửa đổi khi Chế độ xem được vẽ và không phải là Chế độ xem thực tế.Đối với trường hợp , nếu bạn làm động một nút để di chuyển trên màn hình, nút sẽ vẽ chính xác nhưng vị trí thực tế nơi bạn có thể nhấp vào nút không thay đổi, vì vậy bạn phải triển khai logic của riêng mình để xử lý.

Với hệ thống hoạt ảnh thuộc tính, các ràng buộc này hoàn toàn bị xóa và bạn có thể tạo bất kỳ thuộc tính nào của bất kỳ đối tượng nào (Chế độ xem và không xem) và chính đối tượng đó thực sự được sửa đổi. Hệ thống hoạt ảnh cũng mạnh mẽ hơn theo cách nó thực hiện hoạt ảnh . Ở cấp độ cao, bạn chỉ định hoạt ảnh cho thuộc tính mà bạn muốn tạo hiệu ứng động, chẳng hạn như màu sắc, vị trí hoặc kích thước và có thể xác định các khía cạnh của hoạt ảnh như nội suy và đồng bộ hóa nhiều hoạt ảnh.

Hệ thống hoạt ảnh xem, tuy nhiên, mất ít thời gian hơn để thiết lập và yêu cầu ít mã hơn để viết. Nếu hoạt ảnh xem hoàn thành mọi thứ mà bạn cần làm hoặc nếu mã hiện tại của bạn đã hoạt động theo cách bạn muốn, không cần sử dụng hệ thống hoạt ảnh của thuộc tính. Nó cũng có thể có ý nghĩa khi sử dụng cả hai hệ thống hoạt ảnh cho các tình huống khác nhau nếu trường hợp sử dụng phát sinh.

Các vấn đề liên quan