1

我有 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>
4

0 回答 0