2013-03-13 33 views
5

Có cách nào để ngăn việc vẽ các phần của đối tượng, như bitmap hoặc đường dẫn, vượt ra ngoài biên giới của Canvas trong SurfaceView?Ngăn chặn vẽ ngoài canvas với SurfaceView

Khi tôi dần dần mở rộng đối tượng vượt quá kích thước Canvas ', đặc biệt là với sơn mờ, tất cả sẽ chậm lại và vẫn phải đợi vài giây để điều khiển trở lại - không phản hồi. Tôi mở rộng một đối tượng bằng cách di chuyển ngón tay của tôi trên màn hình; nếu tôi làm nó quá nhanh và mở rộng nó, thì nó thực sự làm chậm quá trình vẽ.

Tôi không gặp phải vấn đề tương tự khi chỉ sử dụng canvas bình thường View, vì vậy, không biết điều gì đang làm chậm nó xuống. Đó là mặc dù SurfaceView phản hồi quá nhanh và sau đó bị tắc nghẽn.

Vì vậy, một ý tưởng để cải thiện điều này, là để ngăn chặn vẽ bên ngoài vải, nhưng không chắc chắn nếu SurfaceView có các tùy chọn cắt.

Trả lời

1

Một giải pháp có lẽ là bằng cách sử dụng một trong những Canvas.drawBitmap phương pháp mà chấp nhận một nguồn Rect/RectF lập luận, do đó chỉ có phần nhìn thấy được của Bitmap được trả lại. Tôi đã thực hiện điều này trên dự án của riêng mình để tăng tốc độ hiệu suất SurfaceView nơi tôi có một số Bitmaps đôi khi chỉ một phần trong chế độ xem.

+0

Có, tôi có thể sử dụng điều này với bitmap, nhưng tại thời điểm này, nó vẽ Đường dẫn lớn hơn canvas đó là vấn đề. – Lumis

0

Khi bạn đặt SurfaceView trên bố trí hoạt động của bạn, bạn có thể sử dụng đệm các thuộc tính như:

android:paddingLeft="20dp" 
android:paddingTop="20dp" 
android:paddingRight="20dp" 
android:paddingBottom="20dp" 

Nó hoạt động như thế này:

Padding depiction

Để vẽ canvas của bạn, bạn có thể vẽ các đường viền theo thực tế với:

canvas.drawLine(1,1,canvas.getWidth()-1,1); //Top border 
canvas.drawLine(1,1,1,canvas.getHeight()-1); //Left border 
canvas.drawLine(1,canvas.getHeight()-1,canvas.getWidth()-1,canvas.getHeight()-1); //Bottom border 
canvas.drawLine(canvas.getWidth()-1,1,canvas.getWidth()-1,canvas.getHeight()-1); //Right border 
1

Tôi không chắc liệu canvas có thực sự vẽ những thứ vượt ra ngoài kích thước không, đó không phải là điều thông minh để làm. Tuy nhiên, bạn có thể sử dụng clipRect() để xác định vùng clip.

Bạn đang áp dụng các bộ lọc như làm mờ cho mỗi khung hình? có thể khá đắt.

Ngoài ra, bạn có đang kích hoạt cuộc gọi vẽ trên sự kiện chạm không? Các sự kiện chạm được tạo ra rất nhanh và sẽ làm ngập luồng hiển thị. Bạn có thể muốn nhận sự kiện với tốc độ chậm hơn: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

+0

Vâng, hiệu ứng nhòe thực sự làm chậm nó xuống, đặc biệt khi hình dạng đường dẫn lớn hơn màn hình. clipRect() không có hiệu lực. Tôi đã cố gắng gắn cờ việc ăn xin và kết thúc onDraw() để các sự kiện liên lạc giữa bị bỏ qua, nhưng cũng không giúp ích gì; như bản vẽ đã được chuyển đến phần cứng và đó là nơi nó chậm lại. – Lumis

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