InfiniteViewPager滞后问题

时间:2013-08-30 23:40:36

标签: android android-viewpager

我有Infinite ViewPager应用程序,每件事情都很好但是如果你快速滚动图像你将面临图像滚动之间的滞后,它不流畅和快速,

任何克服这个问题的建议,所以最后我可以快速顺利地滚动它,

任何帮助将不胜感激,谢谢。

ImagePager.java

  public class ImagePager extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    PagerAdapter adapter = new InfinitePagerAdapter(new ImagePagerAdapter(this, imageArra, stringArray));

    ViewPager myPager = (ViewPager) findViewById(R.id.myimagepager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);}

private int imageArra[] = { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,
                            R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i, R.drawable.j,
                            R.drawable.k, R.drawable.l, R.drawable.m, R.drawable.n, R.drawable.o};


private String[] stringArray = new String[] { "Image a", "Image b","Image c","Image d","Image e",
                                              "Image f", "Image g","Image h","Image i","Image j",
                                              "Image k", "Image l","Image m","Image n","Image o"};

                                                               }

ImagePagerAdapter.java

  public class ImagePagerAdapter extends PagerAdapter {

Activity activity;
int imageArray[];
String[] stringArray;

public ImagePagerAdapter(Activity act, int[] imgArra, String[] stringArra) {
    imageArray = imgArra;
    activity = act;
    stringArray = stringArra;
    }   
public int getCount() {
    return imageArray.length;
    }   
public Object instantiateItem(View collection, int position) {
    LayoutInflater inflater = (LayoutInflater)collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.custom_pager, null);   

    ImageView im=(ImageView) layout.findViewById(R.id.myimage);             
    im.setImageResource(imageArray[position]);

    TextView txt=(TextView) layout.findViewById(R.id.image_text);
    txt.setText(stringArray[position]);
    ((ViewPager) collection).addView(layout, 0);
       return layout;   
       }

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);
}

@Override
public Parcelable saveState() {
    return null;
}
}

InfinitePagerAdapter.java

  public class InfinitePagerAdapter extends PagerAdapter {

private static final String TAG = "InfinitePagerAdapter";
private static final boolean DEBUG = true;

private PagerAdapter adapter;

public InfinitePagerAdapter(PagerAdapter adapter) {
this.adapter = adapter;
}

@Override
public int getCount() {
// warning: scrolling to very high values (1,000,000+) results in
// strange drawing behaviour
return Integer.MAX_VALUE;
}

/**
 * @return the {@link #getCount()} result of the wrapped adapter
 */
public int getRealCount() {
return adapter.getCount();
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
int virtualPosition = position % getRealCount();
debug("instantiateItem: real position: " + position);
debug("instantiateItem: virtual position: " + virtualPosition);

// only expose virtual position to the inner adapter
return adapter.instantiateItem(container, virtualPosition);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
int virtualPosition = position % getRealCount();
debug("destroyItem: real position: " + position);
debug("destroyItem: virtual position: " + virtualPosition);

// only expose virtual position to the inner adapter
adapter.destroyItem(container, virtualPosition, object);
}

/*
 * Delegate rest of methods directly to the inner adapter.
 */

@Override
public void finishUpdate(ViewGroup container) {
adapter.finishUpdate(container);
}

@Override
public boolean isViewFromObject(View view, Object object) {
return adapter.isViewFromObject(view, object);
}

@Override
public void restoreState(Parcelable bundle, ClassLoader classLoader) {
adapter.restoreState(bundle, classLoader);
}

@Override
public Parcelable saveState() {
return adapter.saveState();
}

@Override
public void startUpdate(ViewGroup container) {
adapter.startUpdate(container);
}

/*
 * End delegation
 */

private void debug(String message) {
if (DEBUG) {
    Log.d(TAG, message);
}
}
}

InfiniteViewPager.java

  public class InfiniteViewPager extends ViewPager {

public InfiniteViewPager(Context context) {
super(context);
}

public InfiniteViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public void setAdapter(PagerAdapter adapter) {
super.setAdapter(adapter);
// offset first element so that we can scroll to the left
setCurrentItem(0);
}

@Override
public void setCurrentItem(int item) {
// offset the current item to ensure there is space to scroll
item = getOffsetAmount() + (item % getAdapter().getCount());
super.setCurrentItem(item);

}

private int getOffsetAmount() {
if (getAdapter() instanceof InfinitePagerAdapter) {
    InfinitePagerAdapter infAdapter = (InfinitePagerAdapter) getAdapter();
    // allow for 100 back cycles from the beginning
    // should be enough to create an illusion of infinity
    // warning: scrolling to very high values (1,000,000+) results in
    // strange drawing behaviour
    return infAdapter.getRealCount() * 100;
} else {
    return 0;
}
}

}

custom_pager.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical" 
   android:background="#FFDAB9" 
   android:gravity="center_horizontal">
<ImageView android:id="@+id/myimage" 
   android:layout_width="match_parent" 
   android:layout_height="0dp" 
   android:layout_margin="5dp" 
   android:layout_weight="2" /> 
<TextView android:id="@+id/image_text" 
   android:layout_width="fill_parent" 
   android:layout_height="0dp" 
   android:textColor="#B22222" 
   android:gravity="center" 
   android:textSize="20sp" 
   android:paddingLeft="10dp" 
   android:paddingRight="10dp" 
   android:layout_margin="10dp" 
   android:layout_weight="1" 
   android:background="@drawable/border" /> 
 </LinearLayout>

0 个答案:

没有答案