2015-07-21 13 views
7

Tôi có một hình nền Activity nơi tôi có hình nền trong ImageView và chín nút trong suốt ở đầu hình ảnh.Android: Hiệu suất chậm sử dụng hình ảnh lớn trong ImageView

http://i.stack.imgur.com/GGQqd.png

Khi tôi gõ bất kỳ nút tôi thực hiện một RelativeLayout xuất hiện ở phía trên cùng nền.

http://i.stack.imgur.com/JvKQK.jpg

Vấn đề là: Khi tôi sử dụng một hình ảnh có độ phân giải lớn như một nền tảng trong cách bố trí hiệu suất là rất nghèo.

Tôi đang sử dụng một PNG hình ảnh của 2048 x 1536, và trọng lượng của nó là khoảng 500k. Khi tôi sử dụng hình ảnh nhỏ hơn như 1024 x 768 ứng dụng hoạt động tốt, nhưng có vẻ khủng khiếp.

Có hạn chế hoặc phương pháp sử dụng hình ảnh lớn mà không làm mất hiệu suất không?

Trả lời

10

Bản đồ bit đó là lớn. 500k bạn đề cập đến là kích thước nén. Hình ảnh được giải nén trong bộ nhớ khi bạn sử dụng chúng. Bạn đang thực sự xem xét 2048 × 1536 × 4 = 12582912 = hơn 12MB bộ nhớ sử dụng.

Nếu bạn đang sử dụng thiết bị như Nexus 9 có độ phân giải màn hình đó thì bạn có thể giả định nó cũng có băng thông bộ nhớ, GPU và bus để xử lý hình ảnh có kích thước đó. Tuy nhiên, nếu bạn đang ở trên một thiết bị có độ phân giải thấp hơn (hầu hết các thiết bị, hãy nhớ rằng ngay cả Full HD chỉ lớn hơn 65%), thì hình ảnh này là lãng phí đáng kể của bộ nhớ. Bạn có thể mua thiết bị cấp thấp ngay hôm nay với màn hình 240x320, trong đó bitmap toàn màn hình chỉ bằng 2,5% kích thước hình ảnh của bạn.

Bạn sẽ phải chia tỷ lệ hình ảnh đó khi bạn tải hình ảnh đó. Sử dụng BitmapFactory.Options để đặt kích thước mong muốn trước khi tải hình ảnh.

Hơn nữa, bạn đang đặt văn bản trực tiếp lên trên nó. Hiển thị văn bản yêu cầu độ trong suốt của alpha, yêu cầu lấy mẫu hình ảnh bên dưới. Nếu bạn có thể đặt văn bản trên nền mờ và đặt nó lên trên cùng, bạn cũng sẽ tiết kiệm được một số tải GPU, nhưng tôi thực sự không chắc chắn về hiệu suất sẽ mang lại cho bạn nhiều. Nó có thể không quá lớn.

+0

Cảm ơn cho câu trả lời. Ví dụ: tôi đang thử nghiệm ứng dụng trên máy tính bảng ** 2560 x 1600 ** và nền không trông rất tốt nếu tôi giảm kích thước xuống. Tôi đang cố sử dụng 'BitmapFactory.Options' –

1

Bạn có thể sử dụng số Subsampling Scale Image View của Dave Morissey làm thay thế chế độ xem hình ảnh chuẩn.

layout XML:

<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:scaleType="fitXY" 
        android:id="@+id/photo"/> 
      </RelativeLayout> 

Set hình ảnh trong mã và vô hiệu hóa cảm ứng:

photo = (SubsamplingScaleImageView) view.findViewById(R.id.photo); 
photo.setOnTouchListener(new View.OnTouchListener() { 
          @Override 
          public boolean onTouch(View v, MotionEvent event) { 
           return true; 
          } 
         }); 
photo.setImage(ImageSource.uri(Uri.fromFile(new File("/somepath/file.png")))); 

build.gradle:

compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'

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