2013-04-01 26 views
7

Tôi đã áp dụng thành công thư viện Universal Image Loader (phiên bản 1.8.3) cho ứng dụng của mình và tôi đang cố định lại kích thước hình ảnh trước khi hiển thị trong mục Gridview (vì đôi khi hình ảnh quá lớn để lưu vào bộ nhớ).Tôi làm cách nào để thay đổi kích thước hình ảnh trước khi hiển thị hình ảnh trong chế độ xem với Trình tải hình ảnh toàn cầu của Android?

Đây là những gì tôi đang cố gắng:

... 
BitmapFactory.Options resizeOptions = new BitmapFactory.Options(); 
resizeOptions.inSampleSize = 3; // decrease size 3 times 
resizeOptions.inScaled = true; 

options = new DisplayImageOptions.Builder() 
.showStubImage(R.drawable.blank) 
.showImageForEmptyUri(R.drawable.no_image) 
.cacheInMemory() 
.cacheOnDisc() 
.decodingOptions(resizeOptions) 
.build(); 
... 

mã này không làm cho hình ảnh 3 lần nhỏ hơn đối với một số lý do.

Có ai có cách tốt hơn để định lại kích thước hình ảnh theo mật độ được chỉ định chính xác không?

+0

Novoda ImageLoader sẽ làm hình thu nhỏ tự động và bộ nhớ đệm nhiều tầng cho bạn :-) https://github.com/novoda/ImageLoader – Blundell

Trả lời

22

đọc Java tài liệu một cách chăm chú:

Options.inSampleSize lựa chọn đến sẽ KHÔNG được xem xét. Thư viện tính toán kích thước mẫu thích hợp nhất theo tùy chọn imageScaleType(...).

Cũng nhìn vào ImageSizeUtil.defineTargetSizeForView(ImageView imageView, int maxImageWidth, int maxImageHeight) trong đó xác định mục tiêu kích thước cho hình ảnh:

Kích được xác định bởi quan điểm mục tiêu thông số, các thông số cấu hình hoặc kích thước màn hình điện thoại. Kích thuật toán tính toán:

  1. Lấy thực tế rút ra getWidth()getHeight() của View. Nếu chế độ xem chưa được vẽ thì hãy chuyển đến bướC# 2.
  2. Nhận layout_widthlayout_height. Nếu cả hai đều không có giá trị chính xác thì hãy chuyển sang bướC# 3.
  3. Nhận maxWidthmaxHeight. Nếu cả hai không được đặt thì hãy chuyển sang bướC# 4.
  4. Nhận maxImageWidth param (maxImageWidthForMemoryCache) và maxImageHeight param (maxImageHeightForMemoryCache). Nếu cả hai không được đặt (bằng 0) thì chuyển sang bướC# 5.
  5. Nhận kích thước màn hình thiết bị.

định nghĩa UIL gây kích thước Bitmap theo imageScaleTypetargetSize (và scaleType ImageView 's).

+0

ImageScaleType và defineTargetSizeForView là các phương thức để hiển thị hình ảnh nhưng tôi cần giải pháp để thay đổi kích thước hình ảnh trước khi đưa nó vào bộ đệm. Ví dụ: tôi có chế độ xem lưới với 2 cột (mỗi mục lưới là chế độ xem vuông với cạnh 120dip tưởng tượng bên trong) và tôi có hai biến thể của hình ảnh trên máy chủ web, 120x80 px và 640x480 px. Hình ảnh nhỏ quá nhỏ để xem hình ảnh ứng dụng nhưng do đó bộ nhớ cache của bạn rất tốt. Nếu tôi sử dụng hình ảnh lớn thì imageview trông hoàn hảo nhưng lib không thể đưa hình ảnh vào bộ nhớ cache và luôn tải lại chúng trong khi cuộn lưới. –

+0

@ user1328818 "Nếu tôi sử dụng hình ảnh lớn thì hình ảnh trông hoàn hảo nhưng lib không thể đưa hình ảnh vào bộ nhớ cache ..." Điều đó có nghĩa là gì? – NOSTRA

+0

ok, hãy để tôi periphrases, nếu tôi sử dụng hình ảnh nhỏ (120x80) thì thư viện của bạn lưu trữ chúng rất tốt và di chuyển qua chế độ xem lưới của tôi mà hình ảnh lấy từ bộ nhớ cache sau khi tìm nạp từ web. Nhưng nếu sử dụng hình ảnh lớn (640x480), thư viện của bạn sẽ không lưu chúng và hình ảnh sẽ tải mỗi khi tôi cuộn qua chế độ xem lưới. –

2

Bạn có thể đặt chiều cao điểm ảnh và bằng xml. Hình ảnh của bạn sẽ khớp chính xác với chiều cao và chiều rộng được đề cập. Hình ảnh đã tải xuống của bạn phù hợp với chiều cao và chiều rộng được đề cập trong xml của bạn.

Bạn cũng có thể xem xét vấn đề tương tự như vấn đề của mình.

https://github.com/nostra13/Android-Universal-Image-Loader/issues/183

+0

Không chắc bạn đã cho tôi ngay ...anyway nhờ lời khuyên –

14

Chỉ cần cố gắng này:

options = new DisplayImageOptions.Builder() 
.showStubImage(R.drawable.blank) 
.showImageForEmptyUri(R.drawable.no_image) 
.cacheInMemory() 
.cacheOnDisc() 
.decodingOptions(resizeOptions) 
.postProcessor(new BitmapProcessor() { 
    @Override 
    public Bitmap process(Bitmap bmp) { 
     return Bitmap.createScaledBitmap(bmp, 300, 300, false); 
    } 
}) 
.build();