time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android使用自定义属性实现自动播放图片滚动功能

Android使用自定义属性实现自动播放图片滚动功能

时间:2014-06-18 11:00 点击:1189次 字体:[ ]




大家好,记得上次我带着大家一起实现了一个类似与淘宝客户端中带有的图片滚动播放器的效果,但是在做完了之后,发现忘了加入图片自动播放的功能(或许是我有意忘记加的.....),结果图片只能通过手指滑动来播放。于是今天我将再次带领大家,添加上之前遗漏的功能,让我们的图片播放器更加完善。

这次的程序开发将完全基于上一次的代码,如果有朋友还未看过上篇文章,请先阅读http://www.fengfly.com/plus/view-215085-1.html 

既然是要加入自动播放的功能,那么就有一个非常重要的问题需要考虑。如果当前已经滚动到了最后一张图片,应该怎么办?由于我们目前的实现方案是,所有的图片都按照布局文件里面定义的顺序横向排列,然后通过偏移第一个图片的leftMargin,来决定显示哪一张图片。因此当图片滚动在最后一张时,我们可以让程序迅速地回滚到第一张图片,然后从头开始滚动。这种效果和淘宝客户端是有一定差异的(淘宝并没有回滚机制,而是很自然地由最后一张图片滚动到第一张图片),我也研究过淘宝图片滚动器的实现方法,并不难实现。但是由于我们是基于上次的代码进行开发的,方案上无法实现和淘宝客户端一样的效果,因此这里也就不追求和它完全一致了,各有风格也挺好的。

好了,现在开始实现功能,首先是打开SlidingSwitcherView,在里面加入一个新的AsyncTask,专门用于回滚到第一张图片:

  1. class ScrollToFirstItemTask extends AsyncTask<Integer, Integer, Integer> {  
  2.  
  3.     @Override 
  4.     protected Integer doInBackground(Integer... speed) {  
  5.         int leftMargin = firstItemParams.leftMargin;  
  6.         while (true) {  
  7.             leftMargin = leftMargin + speed[0];  
  8.             // 当leftMargin大于0时,说明已经滚动到了第一个元素,跳出循环  
  9.             if (leftMargin > 0) {  
  10.                 leftMargin = 0;  
  11.                 break;  
  12.             }  
  13.             publishProgress(leftMargin);  
  14.             sleep(20);  
  15.         }  
  16.         return leftMargin;  
  17.     }  
  18.  
  19.     @Override 
  20.     protected void onProgressUpdate(Integer... leftMargin) {  
  21.         firstItemParams.leftMargin = leftMargin[0];  
  22.         firstItem.setLayoutParams(firstItemParams);  
  23.     }  
  24.  
  25.     @Override 
  26.     protected void onPostExecute(Integer leftMargin) {  
  27.         firstItemParams.leftMargin = leftMargin;  
  28.         firstItem.setLayoutParams(firstItemParams);  
  29.     }  
  30.  
  31. }  

然后在SlidingSwitcherView里面加入一个新的方法:

  1. /**  
  2.  * 滚动到第一个元素。  
  3.  */ 
  4. public void scrollToFirstItem() {  
  5.     new ScrollToFirstItemTask().execute(20 * itemsCount);  
  6. }  

这个方法非常简单,就是启动了我们新增的ScrollToFirstItemTask,滚动速度设定为20 * itemsCount,这样当我们需要滚动的图片数量越多,回滚速度就会越快。定义好这个方法后,只要在任意地方调用scrollToFirstItem这个方法,就可以立刻从当前图片回滚到第一张图片了。

 

OK,然后我们要定义一个方法用于启动自动播放功能。仍然是在SlidingSwitcherView中新增如下代码:

  1. /**  
  2.  * 用于在定时器当中操作UI界面。  
  3.  */ 
  4. private Handler handler = new Handler();  
  5.  
  6. /**  
  7.  * 开启图片自动播放功能,当滚动到最后一张图片的时候,会自动回滚到第一张图片。  
  8.  */ 
  9. public void startAutoPlay() {  
  10.     new Timer().scheduleAtFixedRate(new TimerTask() {  
  11.         @Override 
  12.         public void run() {  
  13.             if (currentItemIndex == itemsCount - 1) {  
  14.                 currentItemIndex = 0;  
  15.                 handler.post(new Runnable() {  
  16.                     @Override 
  17.                     public void run() {  
  18.                         scrollToFirstItem();  
  19.                         refreshDotsLayout();  
  20.                     }  
  21.                 });  
  22.             } else {  
  23.                 currentItemIndex++;  
  24.                 handler.post(new Runnable() {  
  25.                     @Override 
  26.                     public void run() {  
  27.                         scrollToNext();  
  28.                         refreshDotsLayout();  
  29.                     }  
  30.                 });  
  31.             }  
  32.         }  
  33.     }, 30003000);  
  34. }  

我们可以看到,这个方法里启用了一个定时器,每隔三秒就会执行一次。然后在定时器的执行逻辑里面进行判断当前图片是否是最后一张,如果不是最后一张就滚动到下一张图片,如果是最后一张就回滚到第一张图片。其中需要注意,定时器中的代码是在子线程中运行的,而滚动图片操作和更新页签操作都是UI操作,因此需要放到Handler中去执行。

 

之后只要在Activity创建的时候去调用SlidingSwitcherView的startAutoPlay方法,自动播放功能就实现了!!

结束了?Naive!!  如果就这么结束了,怎么对得起大家的期待,如此简单的功能还要用一篇文章来讲简直是弱爆了。



本文地址 : http://www.fengfly.com/plus/view-215086-1.html
标签: Android
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: