2012-04-13 53 views
6

Tôi có thư viện vẽ và với nó tôi có Chế độ xem tùy chỉnh. Khi bất kỳ cập nhật nào cần được thực hiện, thư viện gọi phương thức invalidate() của chế độ xem. Và sau đó phương thức onDraw() được gọi và mọi thứ hoạt động tốt.View.invalidate() dường như không gọi View.onDraw()

Tuy nhiên, khi tôi thêm thuộc tính của usesSdkVersion="14" vào số AndroidManifest.xml file, điều này sẽ ngừng hoạt động. Phương thức onDraw() của tôi không còn được gọi nữa.

THÔNG TIN THÊM: Dường như khi tôi gọi invalidate() là kết quả của việc nhấn nút trong ứng dụng của tôi, Chế độ xem cập nhật như mong đợi. Ngoài ra, có một hình động bên trong thư viện của tôi đang hoạt động chính xác. Vì vậy, đôi khi nó hoạt động chính xác. Nhưng hầu hết thời gian, nó không được vẽ lại. Có trạng thái nào mà Chế độ xem tùy chỉnh có thể ở trong đó có thể khiến Hệ điều hành bỏ qua vẽ lại sau khi invalidate() được gọi không?

+0

Bạn vẫn đang gọi nó từ chuỗi giao diện người dùng? khác bạn phải sử dụng postInvalidate(). – Heinrisch

+0

Tôi đã thử thay đổi invalidate thành postInvalidate chỉ để kiểm tra điều đó và vấn đề vẫn tồn tại. – Rickster

+0

Bật hoặc tắt tăng tốc phần cứng? –

Trả lời

5

Từ Android 3.0, khi sử dụng Tăng tốc phần cứng, bản vẽ chế độ xem được ghi lại và lưu trữ tại GPU.

Vì vậy, khi bạn có hai chế độ xem: A phía trên B và bạn gọi B.invalidate, B.onDraw sẽ được gọi và ghi vào GPU, nhưng A.onDraw sẽ không được gọi vì nó đã được ghi lại!

Đây là khác với chế độ tăng tốc không phải phần cứng khi tất cả các chế độ xem onDraw được gọi.

2

bằng văn bản chính thức:

Tuy nhiên, do tăng tốc phần cứng không được hỗ trợ cho tất cả các hoạt động vẽ 2D, bật lên có thể ảnh hưởng đến một số ứng dụng của bạn mà sử dụng xem tùy chỉnh hoặc cuộc gọi vẽ. Các sự cố thường tự biểu hiện dưới dạng các yếu tố vô hình, ngoại lệ hoặc pixel được hiển thị sai.

Để khắc phục điều này, Android cung cấp cho bạn tùy chọn để kích hoạt hoặc vô hiệu hóa khả năng tăng tốc phần cứng theo các mức sau:

Application

<application android:hardwareAccelerated="true" ...> 

Hoạt động

.

Window

GetWindow() setFlags (WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

Xem

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Tôi thử nghiệm trong chế độ xem của mình.

1

Dường như một lỗi trong Android. Thay vì vô hiệu() cố gắng sử dụng phương pháp cùng tên với bốn thông số:

view.invalidate(0,0,view.getWidth(), view.getHeight()); 

Bằng cách này, một thói quen tốt hơn để làm mất hiệu lực duy nhất mà khu vực, trong đó đang thay đổi. Vượt qua các tọa độ bên trái, trên cùng, bên phải, dưới cùng của vùng bị vô hiệu.

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