让gallery自动滚动可以通过以下两种方法实现:
一、使用Timer和TimerTask类来完成图片的自动定时滚动:
思路:循环调用Gallery类的onFling()方法。
代码:
task = new TimerTask() {
@Override
public void run() {
/**
* 参数1和2:手指在gallery上的动作
* 参数3和4:x方向和y方向的滚动的速度,-数表示向左滚,+数表示向右
*/
gallery.onFling(null, null, -750, 0);
}
};
timer.schedule(task, 1000, 5000);
方式2:
二、使用Handler消息机制完成
思路:子线程内死循环使用handler每隔多长时间向主线程发送消息,通知gallery改变位置。
代码:
子线程部分:
new Thread(new Runnable() {
int flag = 1;
@Override
public void run() {
while (isalive) {
//images为装图片的集合
if ((cur_index + 1) == images.size()) {
flag = -1;
} else if (cur_index == 0) {
flag = 1;
}
Message msg = handler.obtainMessage(MSG_UPDATE, cur_index,
0);
handler.sendMessage(msg);
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch (flag) {
case 1:
cur_index++;
break;
case -1:
cur_index--;
break;
}
}
}
}).start();
主线程部分:
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == MSG_UPDATE) {
gallery.setSelection(msg.arg1);
}
}
};
两种方式的优缺点:
优点:
使用方式1来实现,效果和手指拖动的效果一样,滚动速度可以自己调。
使用方式2来实现,可以使用继承Gallery的子类,重写onFling方法,返回false来实现手指拖动时图片只滚动一张的效果。
缺点:
使用方式1来实现,当你用手指拖动,就会发现图片滚动的太快了,不是一张一张的滚动的,没法使用继承Gallery的子类,重写onFling方法,返回false来实现手
使用方式2来实现 ,效果没那么好看,图片说换就换了,没缓冲,滚动速度没法控制。
参考android系统源码的Gallery.java文件(http://www.oschina.net/code/explore/android-2.2-froyo/com/cooliris/media/Gallery.java)的实现。具体做法如下:
1. 创建一个继承自Gallery类的子类AutoScrollGallery。
2. 在AutoScrollGallery类中增加一个定时器的成员变量mTimer。
3. 在AutoScrollGallery的成员函数onCreate中初始化该定时器变量,并设置触发间隔。
4. 在定时触发响应函数中调用父类Gallery的成员函数进行滚动。
5. 在AutoScrollGallery的成员函数onDestroy中销毁mTimer。
6. 在你的应用程序中使用该继承类。