`
lyx2007825
  • 浏览: 2057 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Gallery无限定时循环拖动效果

阅读更多

业务需要,需要在Gallery中实现定时循环滚动效果,而网上的大部分资料都是循环跳动,没有像屏幕拖动那种效果,经过几天的研究和资料整合,找出了解决方法。

 

首先定时循环:

       ScheduledThreadPoolExecutor timer = (ScheduledThreadPoolExecutor) Executors

							.newScheduledThreadPool(1);
					ImageTask imageTask = new ImageTask();
					timer.scheduleAtFixedRate(imageTask, 0, 8, TimeUnit.SECONDS);
    private class ImageTask extends TimerTask {
        public void run() {
// getPos是我在imageAdapter中加入的方法,在ImageAdapter加一个成员变量position,然后在getView中将position
的值负值给成员变量,getPos()返回这个成员变量值
			int curPos = imageAdapter.getPos();
         Message message2 = new Message();
			Bundle data = new Bundle();
         data.putInt("pos", curPos);
         message2.what = 1;
			message2.setData(data);
			myHandler.sendMessage(message2);
    }
 

 

 

然后在Handler对象中处理:

 

      imageAdapter.setCount(focusList.size());

      focusGallery.setAdapter(imageAdapter);
 

      //注意,这两个事件是我模拟处理的,其中的数字是我用用手拖动然后用在实际Gallery的onFling事件Log打印出来的。

       想实现定时有一个假象的拖动动作,就模拟了这两个事件。

      MotionEvent e1 = MotionEvent.obtain(
							SystemClock.uptimeMillis(),
							SystemClock.uptimeMillis(),
							MotionEvent.ACTION_DOWN, 322.25406f, 108.34271f, 0);
					MotionEvent e2 = MotionEvent.obtain(
							SystemClock.uptimeMillis(),
							SystemClock.uptimeMillis(),
							MotionEvent.ACTION_MOVE, 146.52338f, 122.55939f, 0);
//这里一定要使用setSelection,否则每次都会从第一张图片滚动,也就是说只要速度正常,只出现第一张和第二张图片
选择当前图片,然后在当前位置下滚动。
					focusGallery.setSelection(msg.getData().getInt("pos"));
					if(firstLoad){
						firstLoad = false;
					}else{
//-945这个值可以自己测试做相应的调整,负值表示向右滑动
						focusGallery.onFling(e1, e2, -945, 0);
					}
					addHeaderPointImage(focusList.size());
}
 

然后在Gallery的Adapter中然getCount()返回Integer.MAX_VALUE;在getView中position参数进行如下处理

 

                                      int imageSize = focusList.size();

					position = position % imageSize;
 

然后就可以无限循环了。

最后处理一下那个圆点。

 

 

focusGallery.setOnItemSelectedListener(new OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> paramAdapterView,
					View paramView, int paramInt, long paramLong) {
				int curPos = imageAdapter.getPos();
				paramInt = curPos % focusList.size();
				Log.v("liuyx", curPos+"");
				for (int i = 0; i < pointImageList.size(); i++) {
					if (paramInt == i) {
						pointImageList.get(i).setImageResource(
								R.drawable.information_focus_cirlce_current);
					} else {
						pointImageList.get(i).setImageResource(
								R.drawable.information_focus_cirlce);
					}
				}
			}

			public void onNothingSelected(AdapterView<?> paramAdapterView) {
			}
		});
 

 

 

 

0
0
分享到:
评论
3 楼 sing_song 2012-11-14  
楼主:有一个更好的解决办法:
关键是用到了
gallery.onKeyDown(
       KeyEvent.KEYCODE_DPAD_RIGHT,
       null);
参考:
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=201005
2 楼 lyx2007825 2012-05-17  
我是在原先公司的项目里改的,你可以用个Gallery试试
1 楼 xiaowangzaixian 2012-05-16  
有效果图吗,lz

相关推荐

Global site tag (gtag.js) - Google Analytics