2011-11-11 20 views
12

Tôi có chế độ xem tùy chỉnh nơi tôi sử dụng các phép biến đổi. Cho đến nay rất tốt, có chức năng như setRotationY(), setScaleX(), setTranslationY() hoặc thậm chí getMatrix() hoạt động như mong đợi, tôi có thể điều khiển chế độ xem của mình và nó hiển thị tốt. Nơi tôi nhấn tường là một số chức năng hoạt động lạ sau đó. Ví dụ chức năng như getHitRect() trả lại giá trị hoàn toàn lạ! Điều này không giúp ích cho các sự kiện liên lạc của tôi.Cách nhận các giới hạn thích hợp của chế độ xem sau khi chuyển đổi Ma trận

Tôi đã cố gắng quá tải chức năng nhưng nó vẫn còn xa làm việc đặc biệt là khi sử dụng xoay hoặc mở rộng quy mô (Dịch làm việc tốt thông qua). Tôi nghĩ rằng đây là một cái gì đó để làm với thực tế là ma trận được thể hiện trong phối hợp con, vì vậy làm thế nào tôi có thể nhận được nó trong phối hợp cha mẹ?

@Override 
    public void getHitRect(Rect outRect){ 

     RectF rect = new RectF(); 
     rect.top = (float) this.getTop(); 
     rect.bottom = (float) this.getBottom(); 
     rect.left = (float) this.getLeft(); 
     rect.right = (float) this.getRight();  

    this.getMatrix().mapRect(rect); 
     rect.round(outRect); 
    } 

Tôi có thể nhận giá trị trực tiếp từ một số chức năng không? Giống như Chiều cao, Chiều rộng, trên cùng hoặc dưới cùng mới.

Trả lời

8

Khi trọng các “getChildStaticTransformation” phương pháp của ViewGroup hoặc thậm chí sử dụng chức năng chuyển đổi như setRotationY(), setScaleX(), setTranslationY(), getMatrix() (có sẵn từ API 11) bạn chỉ ảnh hưởng đến Matrix rendering. Kết quả là Chế độ xem con tùy chỉnh của bạn sẽ trả về Giới hạn "Rects" cách xa nơi con của bạn được vẽ. Đây không phải là một vấn đề hầu hết thời gian nhưng khi bạn bắt đầu sẵn sàng bấm vào nó .. rắc rối đang bắt đầu ... Đây là cách tôi giải quyết vấn đề. Tôi chắc chắn có thể có một cách tốt hơn nhưng vì tôi đã không tìm thấy nhiều thứ về chủ đề ở đây.

Trong ViewGroup quá tải:

public interface Itransformable { 
    public void setTransformationMatrix(Matrix trsMatrix); 
} 

@Override 
protected boolean getChildStaticTransformation(View child, Transformation t) { 
    if (child instanceof Itransformable){ 
     t.clear(); 
     t.setTransformationType(Transformation.TYPE_MATRIX); 
     ... 
     // Do whatever transformation you want here 
     ... 
     ((Itransformable)child).setTransformationMatrix(t.getMatrix()); 
     return true; 
    } else { 
     return false; 
    } 
} 

Đây là Child Custom View: Lưu ý rằng tôi không lưu trữ trực tiếp Matrix Transformation trong giao diện tùy chỉnh nhưng thay vào đó là hình chữ nhật biến đổi. Nếu bạn muốn lưu trữ ma trận (tức là để chuyển đổi sau này giống như điểm ...), bạn có thể cần phải sao chép nó như ma trận sẽ bị thay đổi theo một cách lạ nào đó như nó là tái chế hay cái gì đó.

public class MyCustomView extends View implements MyViewGroup.Itransformable{ 

private Rect mViewRect = null; 

public void setTransformationMatrix(Matrix trsMatrix){ 
    if (trsMatrix!=null){ 
     RectF rect = new RectF(); 
     rect.top = 0; 
     rect.bottom = (float) this.getHeight(); 
     rect.left = 0; 
     rect.right = (float) this.getWidth(); 

     trsMatrix.mapRect(rect); 
     rect.offset((float) this.getLeft(), (float) this.getTop()); 

     if (mViewRect == null) mViewRect = new Rect(); 
     rect.round(mViewRect); 
    } 
} 

public Rect getTransformatedRect() { 
    if (mViewRect!=null){ 
     // OutOfScreen WorkArround - As the view is not Displayed, mViewRect doesn't get updated. 
     if(getRight() < 0 || getLeft() > mParentWidth){ 
      return new Rect(getLeft(),getTop(),getRight(),getBottom()); 
     } else { 
      return mViewRect; 
     } 
    } else { 
     return new Rect(getLeft(),getTop(),getRight(),getBottom()); 
    } 
} 

@Override 
public void getHitRect(Rect outRect){ 

    if (mViewRect == null){ 
     super.getHitRect(outRect); 
    } else { 
     outRect.set(getTransformatedRect()); 
    } 
} 
+0

Cảm ơn câu trả lời của bạn, nó giúp tôi :) –

+0

Một điều khác cho Android> = 4.0: 'getHitRect()' sẽ không tự động được gọi nếu bạn đang nhấp vào chế độ xem của bạn. Để thêm tính tương thích cho các dự án sử dụng SDK <4.0, sử dụng 'isTransformedTouchPointInView()' trên công việc của cha mẹ ngay cả khi nó không hoàn hảo. –

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