`
zsnlovewl
  • 浏览: 175407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android的gallery实现无限循环和降低选择频率

 
阅读更多

gallery是一个很好用的控件,可以实现很炫的效果。不过有的时候要对gallery进行改造,使其效果更完美。
  Gallery组件主要用于横向显示图像列表,不过按常规做法。Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了。为了实现像UCWeb的循环显现导航菜单,要进行相应的改造。  
循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点。循环显示图像也可以模拟这一点。
如果这时Gallery组件正好显示到最后一个图像,position参数值正好为getCount() - 1。那么我们如何再让Gallery显示下一个图像呢?也就是说让position参数值再增1,对!将getCount()方法的返回值也增1。
那么这里还有一个问题,如果position参数值无限地增加,就意味着resIds数组要不断地增大,这样会大大消耗系统的资源。想到这,就需要解决两个问题:既要position不断地增加,又让resIds数组中保存的图像资源ID是有限的,该怎么做呢?对于getCount()方法非常好解决,可以让getCount方法返回一个很大的数,例如,Integer.MAX_VALUE。这时position参数值就可以随着Gallery组件的图像不断向前移动而增大。现在resIds数组只有15个元素,如果position的值超过数组边界,要想继续循环取得数组中的元素(也就是说,当position的值是15时,取resIds数组的第0个元素,是16时取第1个元素),最简单的方法就是取余,代码如下:
resIds[position % resIds.length]
对ImageAdapter类做了如下两个改进:
1. 使getCount方法返回一个很大的值。建议返回Integer.MAX_VALUE。
2. 在getView方法中通过取余来循环取得resIds数组中的图像资源ID。
通过上面两点改进,可以使图像列表在向右移动时会循环显示图像。当然,这种方法从本质上说只是伪循环,也就是说,如果真把图像移动到getCount方法返回的值那里,那也就显示到最后一个图像的。不过在这里getCount方法返回的是Integer.MAX_VALUE,这个值超过了20亿,除非有人真想把图像移动到第20亿的位置,否则Gallery组件看着就是一个循环显示图像的组件。代码如下:
   
view plaincopy to clipboardprint?
01.public class ImageAdapter extends BaseAdapter   
02.   {   
03.       int mGalleryItemBackground;   
04.       private Context mContext;   
05.  
06.       public ImageAdapter(Context context)   
07.       {   
08.           mContext = context;   
09.           TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);   
10.           mGalleryItemBackground = typedArray.getResourceId(   
11.                   R.styleable.Gallery_android_galleryItemBackground, 0);                           
12.       }   
13.       // 第1点改进,返回一个很大的值,例如,Integer.MAX_VALUE   
14.       public int getCount()   
15.       {   
16.           return Integer.MAX_VALUE;   
17.       }   
18.  
19.       public Object getItem(int position)   
20.       {   
21.           return position;   
22.       }   
23.  
24.       public long getItemId(int position)   
25.       {   
26.           return position;   
27.       }   
28.  
29.       public View getView(int position, View convertView, ViewGroup parent)   
30.       {   
31.           ImageView imageView = new ImageView(mContext);   
32.               // 第2点改进,通过取余来循环取得resIds数组中的图像资源ID   
33.           imageView.setImageResource(resIds[position % resIds.length]);   
34.           imageView.setScaleType(ImageView.ScaleType.FIT_XY);   
35.           imageView.setLayoutParams(new Gallery.LayoutParams(163, 106));   
36.           imageView.setBackgroundResource(mGalleryItemBackground);   
37.           return imageView;   
38.       }   
39.   }  
public class ImageAdapter extends BaseAdapter
    {
        int mGalleryItemBackground;
        private Context mContext;
        public ImageAdapter(Context context)
        {
            mContext = context;
            TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
            mGalleryItemBackground = typedArray.getResourceId(
                    R.styleable.Gallery_android_galleryItemBackground, 0);                        
        }
        // 第1点改进,返回一个很大的值,例如,Integer.MAX_VALUE
        public int getCount()
        {
            return Integer.MAX_VALUE;
        }
        public Object getItem(int position)
        {
            return position;
        }
        public long getItemId(int position)
        {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent)
        {
            ImageView imageView = new ImageView(mContext);
                // 第2点改进,通过取余来循环取得resIds数组中的图像资源ID
            imageView.setImageResource(resIds[position % resIds.length]);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            imageView.setLayoutParams(new Gallery.LayoutParams(163, 106));
            imageView.setBackgroundResource(mGalleryItemBackground);
            return imageView;
        }
    }

gallery菜单滑动有一个不好的效果就是每次经过中间的菜单都默认是被选中状态,同时会加载数据 以至于切换不流畅,有一种卡卡的感觉!!其实用线程来处理这个问题,一定的时间后如果选择的index值不变,说明已经稳定不变。
private int showingIndex = -1;   
private static final int TIME_OUT_DISPLAY =300;   
private int toShowIndex = 0;   
//--------------------------------------------------   
//在选中事件里面做处理   
public void onItemSelected(AdapterView<?> parent, View v, final int position,   
long id) {   
  
  
//--------------------------------------------------   
toShowIndex = position;   
final Handler handler = new Handler() {      
@Override  
public void handleMessage(Message msg) {   
if(showingIndex != toShowIndex){   
showingIndex = toShowIndex;   
menu_position = position;   
  
//做你的业务逻辑处理   
}   
}      
};   
Thread checkChange = new Thread() {        
@Override  
public void run() {   
int myIndex = toShowIndex;   
try {   
sleep( TIME_OUT_DISPLAY );   
if( myIndex == toShowIndex ){   
handler.sendEmptyMessage(0);      
}   
} catch (InterruptedException e) {   
e.printStackTrace();   
}   
}      
};   
  
checkChange.start();   
  
.  
}  

来自:http://www.eoeandroid.com/thread-54390-1-1.html

分享到:
评论

相关推荐

    Android3D画廊Gallery实现无限循环和自动跳转

    本教程将深入讲解如何在Android应用中实现一个3D画廊(Gallery)组件,支持无限循环、自动跳转以及倒影效果。 首先,我们需要理解`Gallery`组件。`Gallery`是Android提供的一个HorizontalScrollView的扩展,用于...

    android Gallery 3d实现无限循环播放 用做广告板最后了

    总的来说,"android_FancyCoverFlow"项目展示了如何利用自定义控件和动画来创建一个功能丰富的3D广告板,其无限循环和倒影效果增强了用户的交互体验。对于想要在Android应用中实现类似功能的开发者,深入研究这个...

    UI开发第七篇之Android gallery实现图片的循环旋转

    在Android UI开发中,`Gallery`组件是一种可以展示多个项目并允许用户左右滑动选择的控件,常用于实现图片轮播或者选项选择等场景。本篇将详细讲解如何利用`Gallery`实现图片的循环旋转。 首先,我们需要在布局文件...

    Android Gallery 3张图无限循环 左右滑动都有效

    在这个场景中,提到的"Android Gallery 3张图无限循环 左右滑动都有效"是指一个特定的实现,即在`Gallery`中加载三张图片,并且当用户向左或向右滑动时,图片能够无缝地循环,形成一种无限滚动的效果。下面将详细...

    ViewPager 实现gallery效果+无限循环滚动

    在本教程中,我们将深入探讨如何利用ViewPager实现一个类似画廊(Gallery)的效果,并且让其能够无限循环滚动。 首先,我们要了解ViewPager的基本用法。ViewPager是Android Support Library的一部分,它允许用户在...

    Android基于Gallery实现网络图片和本地图片循环播放

    - 为了实现循环播放,我们需要维护一个包含所有图片(包括网络和本地)的列表或数组,可以是URL字符串列表(对于网络图片)或者Bitmap列表(对于本地图片)。 6. **监听器**: - 为Gallery设置`...

    UI开发之Android gallery实现图片的循环旋转

    初始化`Gallery`时,我们可以通过`setSelection`方法设置一个较大的初始位置,这样当用户滚动到列表末尾时,图片会无缝过渡到开头,实现循环效果。例如: ```java gallery.setSelection(200); ``` 为了实现无限...

    Gallery无限循环.zip

    综上所述,"Gallery无限循环.zip"可能是一个涉及Android应用开发、图片浏览功能实现的项目,使用了旧版的Android组件和构建配置,同时包含了代码混淆的设置。开发者需要对Android SDK、Activity生命周期、布局设计...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    在Android开发中,`Gallery`组件是一个非常有用的控件,它允许用户水平滑动浏览多个项目,常用于图片浏览或选项选择。本示例着重讲解如何在`Gallery`中实现异步加载网络图片,并且只加载当前显示的页面,以提高性能...

    Android Gallery自定义ImageView和Gallery实现图片浏览功能

    Android Gallery 自定义ImageView和Gallery实现图片浏览功能,类似Android图库软件,主要实现的功能有:图片左右滑动、放大缩小、放大弹回、缩小弹回。 一开始使用Viewpager实现图片浏览,发现两张图片滑动时没有...

    无限循环滑动gallery

    在Android开发中,"无限循环...通过研究和理解这些代码,开发者可以学习如何在自己的项目中实现无限循环滑动的gallery效果。这种自定义组件的实现不仅能够提升应用的用户体验,也是对Android开发技能的深入理解和应用。

    无限自动循环的gallery 可以点击

    1. **无限循环**:原生的`Gallery`组件并不支持无限循环,但通过开发者们的智慧,可以通过巧妙地重置数据源和设置适配器来实现这一功能。当用户在最后一张图片向左滑动时,会显示第一张图片;反之,从第一张图片向右...

    Gallery实现广告循环

    最后,如果你有一个名为“无限循环广告demo”的项目,那么它可能包含了完整的实现代码和资源文件,你可以参考该项目的代码来更好地理解`Gallery`广告循环的实现方式。 总的来说,通过使用Android的`Gallery`控件,...

    android Gallery实现异步加载网络图片

    android Gallery实现异步加载网络图片 并只加载当前停止页面图

    gallery无限循环

    在`Galleryone`这个压缩包文件中,可能包含了一个简单的`Gallery`无限循环的示例代码或者项目的源码,你可以下载并研究其中的实现细节,以便更深入地理解和应用这个功能。 总的来说,实现`Gallery`无限循环的关键...

    Gallery实现无线循环代码

    在Android开发中,`Gallery`组件是一个非常有用的控件,它允许用户在多个项目中进行水平滑动选择,常用于图片浏览或者下拉菜单等场景。然而,原生的`Gallery`组件并不支持无限循环的功能,也就是说,当用户在最后一...

    android 循环gallery 选中时图片放大 可按钮控制左右

    在这个特定的需求中,我们不仅需要让Gallery实现循环滚动,还要在选中图片时对其进行放大,并提供按钮来控制图片的左右切换,同时加入图片选中时的弹出动画效果。下面我们将详细讲解如何实现这些功能。 首先,我们...

    android 循环gallery 选中放大 按键控制

    为了实现循环滚动,我们需要在`Gallery`的`onScroll`或`onItemSelectedListener`回调中调整当前选中的索引。当达到首尾时,将索引重新设置为相对另一端的下一项。例如: ```java gallery.setOnItemSelectedListener...

    Gallery选中高亮和无限循环

    综上所述,结合自定义适配器、监听器以及适当的滚动处理,我们可以实现`Gallery`组件的选中高亮和无限循环滚动效果。不过,需要注意的是,`Gallery`组件在Android API 16之后已被弃用,建议使用`RecyclerView`配合`...

    android gallery简单应用

    在早期的Android版本中,`Gallery`是实现轮播效果的常见选择,但在Android 3.0(API级别11)之后,`ViewPager`逐渐取代了它的地位,因为`ViewPager`提供了更丰富的交互性和更好的性能。尽管如此,理解`Gallery`的...

Global site tag (gtag.js) - Google Analytics