2013-01-15 33 views
10

Tôi đã làm việc trên một ứng dụng có bố cục phức tạp. Gần đây tôi đã nhận ra rằng tôi cần phải tạo một phần hoặc tất cả bố cục có thể thu phóng.Đặt bố cục android và bố trí lồng nhau trong phạm vi zoomable

Một trong các tệp xml chính của tôi có bố cục tuyến tính với nhiều bố cục được lồng trong đó đến vị trí xem chính xác. Có cách nào dễ dàng để thực hiện bố cục tuyến tính này và mọi thứ bên trong có thể thu phóng không? Hoặc sẽ dễ dàng hơn để làm cho toàn bộ tệp bố cục có thể thu phóng được không? Những lựa chọn của tôi là gì?

Trả lời

1

Bạn có thể xem xét các biến đổi tĩnh. Bất kỳ ViewGroup hoặc lớp con nào cũng có thể được tùy chỉnh để áp dụng phép chuyển đổi cho chế độ xem con của nó. Bạn bật tính năng này bằng cách gọi setStaticTransformationsEnabled(true) và sau đó ghi đè số gọi lại getChildStaticTransformation() (docs link) trong tùy chỉnh ViewGroup. Bạn có thể áp dụng bất kỳ chuyển đổi nào bạn thích, bao gồm cả thang đo để tạo hiệu ứng thu phóng của bạn. Lệnh gọi lại này sẽ được gọi bất kỳ lúc nào mà khung nhìn cần được vẽ lại hoặc không hợp lệ.

Ngoài ra, hãy cẩn thận khi sử dụng tính năng này cùng với tăng tốc phần cứng. Tùy thuộc vào tần suất mà bạn cần cập nhật các phép biến đổi mà bạn có thể thấy phần cứng không hoàn toàn hoạt động để vẽ lại như bạn mong đợi. Nếu vậy, bạn sẽ cần phải bật các lớp phần mềm cho cấu trúc phân cấp khung nhìn này.

+0

[ví dụ] (http://stackoverflow.com/questions/4261527/resizing-scaling-down-android-widgets-datepicker-and-timepicker) – Leonidos

4

Trước hết mở rộng lớp đó với độ xem cụ thể

public class MyImageView extends ImageView{ 

Override phương pháp sau đây.

@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
canvas.save(); 

canvas.scale(mScaleFactor, mScaleFactor, midPoint.x, midPoint.y); 
if(appInitialized) { 

hsSide.draw(canvas); 
scaleA.draw(canvas); 
scaleB.draw(canvas); 

    } 

canvas.restore(); 


} 

Tạo trình phát hiện cử chỉ sẽ phát hiện kích thước đối tượng thu phóng và bạn có thể giới hạn để tránh chồng chéo.

 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

@Override 
public boolean onScale(ScaleGestureDetector detector) { 

    mScaleFactor *= detector.getScaleFactor(); 
    pivotX = detector.getFocusX(); 
    pivotY = detector.getFocusY(); 
    // Don't let the object get too small or too large. 
    mScaleFactor = Math.max(0.8f, Math.min(mScaleFactor, 2.0f)); 

    invalidate(); 
    return true; 
    } 
} 

Cuối cùng khởi động đối tượng

ScaleGestureDetector mScaleDetector; 



    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
+0

Cảm ơn bạn tôi sẽ thử! – Peter

+0

Điều này có hiệu quả nếu bố cục gốc i "m cố gắng thực hiện điều này không phải là một lần xem hình ảnh? Nó là bố cục với các chế độ xem và bố cục khác bên trong nó – Peter

+0

Bạn có thể mở rộng nó với bất kỳ lớp xem nào. và bạn có thể hạn chế điều đó để chồng lên một khung nhìn khác cho phù hợp – Jan

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