2012-05-04 41 views
10

Tôi đang sử dụng SurfaceView để hiển thị hình ảnh lớn (thường lớn hơn màn hình, nhưng không phải lúc nào) trong ứng dụng Android. Đây thực sự là đồ họa đơn giản và dễ thực hiện việc cuộn bằng cách sử dụng OnTouchListener hoặc GestureDetector. Đồ họa chạy trong một vòng lặp Render, nhưng hiệu suất có vẻ là hơn đủ cho tất cả các thiết bị thực tế (giả lập có thể là một chút đau đớn, mặc dù).Thực hiện Ghim và Thu phóng trên SurfaceView của Android

Tôi đang cân nhắc triển khai Ghim và Thu phóng trên hình ảnh, nhưng tôi muốn tránh phải truy cập OpenGL, vì tôi có ít kinh nghiệm với OpenGL và sử dụng OpenGL có vẻ như quá nhiều cho một thứ đơn giản .

Dường như lớp android.graphics.Camera có thể cho phép tôi triển khai chức năng thu phóng mà tôi muốn.

Có ai biết về bất kỳ ví dụ hay nào cho thấy việc triển khai chức năng giống như pinch-zoom trên SurfaceView Android cơ bản không?

Ngoài ra nếu bạn đã thực hiện một cái gì đó như thế này, bất kỳ suy nghĩ về hiệu suất? OpenGL có xứng đáng với những rắc rối thêm, cho rằng những gì được yêu cầu ở đây rất đơn giản?


Câu hỏi không rõ ràng ở đây hay tôi thiếu một số tài liệu/mã rõ ràng trên trang web dành cho nhà phát triển Android mà tôi nên tìm thấy?

+0

Tôi cũng đang tìm kiếm nội dung như thế này. Bạn đã nhận được giải pháp. Bạn có thể chia sẻ nó không. – Nir

+0

Thật không may, không có gì mà tôi thực sự hài lòng. Đó là tất nhiên có thể để "brute-lực lượng" zoom (bằng cách sử dụng GestureDetector), nhưng nó không phải là một giải pháp rất tốt và có thể là bộ nhớ khủng khiếp chuyên sâu. –

+0

Hmm ... hãy xem hướng dẫn này: http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/ Tôi chưa tự mình kiểm tra, nhưng chỉ dựa trên một cái nhìn nhanh chóng, nó trông đầy hứa hẹn. –

Trả lời

3

OK - cuối cùng đã có thời gian để thực sự nghiên cứu về điều này trong một khoảng thời gian, tôi thực sự đã tìm ra giải pháp giải quyết được vấn đề tôi gặp phải.

Giải pháp dựa trên BitmapRegionDecoder (API10 +). Điều này cho phép ứng dụng tải trong một phần của bitmap, thay vì cố gắng tải toàn bộ bitmap trong một lần.

Bản chất của giải pháp:

  1. Một downsampled phiên bản của toàn bộ bitmap được giữ trong bộ nhớ. Bởi vì phiên bản này được downsampled, nó có thể được giữ ở đó vĩnh viễn.
  2. Một chuỗi tải trong chế độ xem hiện tại (hoặc nhiều hơn một chút) của bitmap vào bộ nhớ liên tục (sử dụng BitmapRegionDecoder). Vì đây là lớn hơn một chút so với màn hình, điều này cũng nên phù hợp thoải mái trong bộ nhớ.
  3. Chuỗi hiển thị vẽ phiên bản phù hợp với Canvas; tức là, nếu bạn đang thu nhỏ hoặc bitmap không khả dụng (ví dụ: vì nó đang tải trong nền), sau đó sử dụng phiên bản được lấy mẫu xuống.
  4. Pan, Fling và Zoom được xử lý bằng GestureListeners.

Tín dụng chuyển đến John Lombardo để thực hiện ý tưởng đầu tiên tôi đã tìm thấy.

tôi mở có nguồn gốc thực của riêng tôi cùng với một số các lớp tiện ích khác của tôi tại https://github.com/micabyte/android_game

Đó là một thực hiện khá gần đây, vì vậy nó không có lễ rửa tội của lửa từ người dùng thực vào lúc này. Tuy nhiên, tôi đã chạy thử nghiệm với hiển thị bitmap 8000x4000 pixel và không có vấn đề cho đến nay. Hiệu suất chắc chắn có vẻ phù hợp với nhu cầu của tôi.

+0

Dự án lib của CNTT – Dilip

0

Thực hiện chụm và thu phóng là thứ bạn sẽ làm với sự kết hợp giữa ScaleGestureDetector và giao diện Canvas với ma trận chuyển đổi. Bạn sẽ muốn sử dụng cùng một ma trận chuyển đổi để xử lý cả quy mô và bản dịch.

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