如果不从图像堆栈的中间开始,如何在无限循环中从左到右,从右到左旋转它们?我尝试了setSelection(position),但由于某种原因,我得到的方法被调用了几次而且不一致。我的图像增量必须保存在应用程序状态中,这样会使它更复杂。
@Override
public void setSelection(int position){
int sectionPos = getCurrentPositionFromState();
if (sectionPos == (this._images - 1)){
setCurrentPositionFromState(0);
sectionPos = 0;
}
else {
setCurrentPositionInState(sectionPos +1);
}
if (sectionPos <= (this._images - 1) ){
super.setSelection(sectionPos);
}
}
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
gallery.setSelection(position);
@Override
public void onNothingSelected(AdapterView parent) {
}
});
我还应该提到我有一个onFling()覆盖,如:
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, 0, velocityY);
}
答案 0 :(得分:1)
有几种方法可以解决这个问题,但在所有情况下,它在技术上从来都不是“无限的”。我从窥探了一段时间后得到了我的基础。
首先,我们需要将一个库放入布局中的xml文件中。所以创建文件后放入一个像这样的小片段:
<!-- Gallery To show images Gallery -->
< Gallery
android:id="@+id/galleryView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="15dip"/>
现在让我们设置一个不同图像的矢量,这样我们就可以循环播放了。我们将从我们的资源中获取这些图像,但是如果您想从其他地方获取它们,那么只需插入它即可。我们将把它插入到onCreate()中。这将允许我们有一个id的向量,我们可以在以后将图像放入图库时参考:
public Vector<Integer> mPhotoVector = new Vector<Integer>();
public void setPhotos() {
for(as many photos as you want){
int imageResource = getResources().getIdentifier("imageNAme", "drawable", getPackageName());
mPhotoVector.add(imageResource);
}
其中galView是布局中的图库视图。当我们完成这个项目时,我们需要从xml调用库视图并将其初始化为我们将在代码中的库变量。
LoopingGalleryAdapter adapter;
Gallery galView;
adapter = new LoopingGalleryAdapter(this, mPhotoVector);
galView = (LoopingGallery)mLayoutView.findViewById(R.id.galleryView);
galView.setAdapter(adapter);
galView.setSelection((galView.getCount() / 2));
setSelection()
让我们看着画廊的中间,这使它看起来是“无限的”,因为现在每边都有1073741823个元素。
接下来我们需要创建适配器。基础是创建最大的图库,接下来我们只需添加我们自己的小getCount方法。这将创建一个太大而无法让用户(可能)滚动到结尾的图库。
最后在适配器上我们有项目的主要内容,要求我们设置我们的位置。这是关键。一旦将位置设置为图库的中间位置,就好像你的两边都有无限的图像循环。
我开始有点像这样:
public class LoopingGalleryAdapter extends BaseAdapter {
private ImageView iv;
private Context mContext;
public PhotoVector mPhotoVector = null;
int mGalleryItemBackground;
public LoopingGalleryAdapter(Context c, PhotoVector aVector) {
this.mContext = c;
mPhotoVector = aVector;
}
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return position;
}
public ImageView getImage(){
return iv;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
iv = new ImageView(mContext);
private final int middle = 1073741823; //this is the middle index of the gallery in galView
/************************************************************************
*if you have a vector/array/arrayList of photos you would like to display
************************************************************************/
if((position - middle) >= 0) { relativePosition = (position-middle) % mPhotoVector.size(); }
else { relativePosition = mPhotoVector.size() - (Math.abs(position - middle) % mPhotoVector.size()); }
Drawable draw = mContext.getResources().getDrawable(mPhotoVector.get(relativePosistion));
/*********************************************
*otherwise you can just insert a photo like so
*********************************************/
Drawable draw = mContext.getResources().getDrawable(R.drawable.what_you_want);
iv.setImageDrawable(draw);
return iv;
}
}
我们现在已经完成了!
此外,我发现其中一个非常有用的技巧,如果在从互联网上获取图像时没有必要,那就是计算你经过getView()
的次数,并在清除了10-20次之后缓存,这样你就不会抛出OutOfMemoryError
:
if(counter >= 20){
galView.destroyDrawingCache();
counter = 0;
}
或让getView()
抛出OutOfMemoryError
,抓住它并返回一个空的ImageView(iv),然后清除然后调用galView.destroyDrawingCache();
答案 1 :(得分:0)
一个无耻的自我插件,刚写了一篇无限滚动图库教程:
http://blog.blundellapps.com/infinite-scrolling-gallery/
也可以下载源代码,选择图像大小。
您可以使用SD卡上的图像或/ resources / drawable目录中的图像。