2013-04-02 37 views
9

Xin chào, tôi có một người xem với nhiều trang (sử dụng máy nhắn tin trạng thái phân đoạn) và một số png làm hình nền cho các trang đó. Tôi đã theo dõi hiển thị bitmap trong Ui (http://developer.android.com/training/displaying-bitmaps/display-bitmap.html) vì vậy tôi đã bộ nhớ đệm và thiết lập các hình ảnh drawable trong một chủ đề nền. Nhưng tôi vẫn nhận được một số tụt hậu khi swithcing trang của máy nhắn tin. Trên mỗi mảnh, tôi chỉ thổi phồng khung nhìn trên phương thức onCreateView(), vì vậy tôi không có ý tưởng gì có thể gây ra sự chậm trễ này. Tôi có thể làm gì để loại bỏ hiệu ứng lag/choppy này?Android ViewPager Lag

Trả lời

12

Bạn có thể thử dùng viewPager.setOffScreenLimit (kích thước) cho số trang của mình. Điều này sẽ tải tất cả các mảnh một lần và tiếp tục tải lại chúng trong khi vuốt.

+0

Chỉ cần chỉnh sửa nhỏ, đó là 'viewPager.setOffscreenLimit (size)'. Điều này làm việc cho tôi mặc dù, cảm ơn! –

42

Tôi gặp sự cố tương tự.

Tôi đang hiển thị các trang giống như hướng dẫn. Mỗi trang là một jpg toàn màn hình.

Lúc đầu, tôi đặt ảnh trong thư mục res/drawables. Các viewpager là rất laggy khi swiping nó.

Sau đó, tôi di chuyển các jpg đó đến res/drawable-hdpi thư mục, độ trễ đã biến mất.

Tôi nghĩ rằng các tối ưu hóa khác nhau được thực hiện trên các hình ảnh dựa trên thư mục. Vì vậy, chúng tôi không thể đặt mọi thứ vào res/drawable thư mục

+0

Đây chính là vấn đề của tôi và câu trả lời của bạn đã giải quyết vấn đề đó cho tôi. Tôi đặt tất cả các hình nền kích thước đầy đủ trong thư mục xhdpi và bây giờ nó mịn như bơ. :) – Amyth

+0

làm thế nào để địa ngục bạn thậm chí con số này ra. Tôi gần như bắt đầu nghĩ "ồ, có lẽ nó đang dùng quá nhiều ram bcz của hình ảnh khổng lồ" rồi tôi chỉ làm những gì bạn nói. Và nó chỉ hoạt động. Tôi đặt tôi vào xhdpi. Đó là điện thoại có nghĩa là với hdpi/mdpi/xxhdpi/xxxhdpi cũng sẽ hiển thị nền của tôi. – Alex

0

Tôi cũng gặp vấn đề tương tự và trong trường hợp của tôi, sự chậm trễ là do ảnh nền của bố cục quá lớn. Tôi chỉ thay đổi kích cỡ hình ảnh và độ trễ swiping đã biến mất

0

Giải pháp của tôi để tránh chậm trễ này khi các trang chuyển đổi là: hình ảnh tải trước

final Drawable[] images = new Drawable[3]; 
for(int i=0; i<3; i++){ 
    int position = i+1; 
    images[i] = getResources().getDrawable(getResources().getIdentifier("image"+position, "drawable", getPackageName())); 
} 

và sau đó:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      imageSwitcher.setImageDrawable(images[position]); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
    }); 
+0

Mặc dù mã được đánh giá cao, nó luôn luôn nên có một lời giải thích kèm theo. Điều này không phải là dài, nhưng nó được mong đợi. – peterh

1

Xây dựng trên @coderek câu trả lời dường như tôi đã giải quyết vấn đề này bằng cách tìm nạp bitmap mà không cần mở rộng quy mô cho các mật độ cụ thể:

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inScaled = false; 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource, opts); 

((ImageView) view).setImageBitmap(bitmap); 

Sử dụng hình ảnh từ drawable thư mục trong một thiết bị xxhdpi dẫn đến bộ nhớ được cấp lên đến 8 lần!

PS:

Bạn cũng có thể xuống mẫu drawable nếu độ phân giải là quá lớn:

opts.inSampleSize = 2; 
2

Đối với loại bỏ lag:

1) Đặt hình ảnh trong res/drawable- hdpi nếu hình ảnh tĩnh. Nếu nó được tải xuống từ URL thì hãy sử dụng chuỗi nền để tải hình ảnh.

2) đặt giới hạn màn hình tắt trang theo phương pháp này viewPager.setOffScreenLimit (kích thước). Với sự trợ giúp của bộ đệm này, số lượng màn hình tối thiểu mà bạn đặt trong phương thức này theo mặc định giá trị của nó là 1.

3) Bạn có thể sử dụng FragmentPagerAdapterFragmentStatePagerAdapter cho hiệu suất tốt hơn.

0

Không có giải pháp nào ở trên hoạt động trong trường hợp của tôi!

Tôi đã tìm thấy một thư viện hoạt động xung quanh vấn đề và bổ sung thêm một số tính năng thú vị khác. Take a look at it here!

Hãy thử điều này:

Trong gradle

compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:[email protected]' 

onCreate

viewPager.setPageTransformer(true, new DefaultTransformer()); 

Bạn có thể nhận được một số efects chuẩn không bằng cách thay đổi số thứ hai, mặc dù không phải tất cả trong số họ làm việc đúng cách.

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