Android 图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!

来源:互联网 发布:亚裔模特知乎 编辑:程序博客网 时间:2024/05/01 22:01

转载地址:http://blog.csdn.net/guolin_blog/article/details/8796877

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

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

[java] view plaincopy
  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里面加入一个新的方法:
[java] view plaincopy
  1. /** 
  2.  * 滚动到第一个元素。 
  3.  */  
  4. public void scrollToFirstItem() {  
  5.     new ScrollToFirstItemTask().execute(20 * itemsCount);  
  6. }  
这个方法非常简单,就是启动了我们新增的ScrollToFirstItemTask,滚动速度设定为20 * itemsCount,这样当我们需要滚动的图片数量越多,回滚速度就会越快。定义好这个方法后,只要在任意地方调用scrollToFirstItem这个方法,就可以立刻从当前图片回滚到第一张图片了。

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

[java] view plaincopy
  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!!  如果就这么结束了,怎么对得起大家的期待,如此简单的功能还要用一篇文章来讲简直是弱爆了。

接下来才是今天的重点,我们要使用自定义属性来启用自动播放功能,这样才能让你更加接近高手,才能让你更加玩转Android。

那我们继续,在res/values目录下新建一个attrs.xml文件,里面加入代码:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <resources>  
  3.   
  4.     <attr name="auto_play" forMymat="boolean" />  
  5.   
  6.     <declare-styleable name="SlidingSwitcherView">  
  7.         <attr name="auto_play" />  
  8.     </declare-styleable>  
  9.   
  10. </resources>  
其中,auto_play是我们将要使用的属性名,格式是布尔型。SlidingSwitcherView这个值可以随意,主要在代码中需要引用相应的id。

然后重写SlidingSwitcherView的构造函数,在里面加入从布局文件中获取自定义属性的代码:

[java] view plaincopy
  1. public SlidingSwitcherView(Context context, AttributeSet attrs) {  
  2.     super(context, attrs);  
  3.     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlidingSwitcherView);  
  4.     boolean isAutoPlay = a.getBoolean(R.styleable.SlidingSwitcherView_auto_play, false);  
  5.     if (isAutoPlay) {  
  6.         startAutoPlay();  
  7.     }  
  8.     a.recycle();  
  9. }  
可以看到,我们在构造函数中去获取auto_play的值,如果为true,就调用startAutoPlay方法,从而启用了自动播放的功能。

接下来就是见证奇迹的时刻!让我们打开activity_main.xml,在里面加入两行关键性代码。在最外层的LinearLayout加入xmlns:myattr="http://schemas.android.com/apk/res/com.example.viewswitcher"。在我们自定义的com.example.viewswitcher.SlidingSwitcherView加入myattr:auto_play="true"。完整XML代码如下:

[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     xmlns:myattr="http://schemas.android.com/apk/res/com.example.viewswitcher"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:orientation="vertical"  
  7.     tools:context=".MainActivity" >  
  8.   
  9.     <com.example.viewswitcher.SlidingSwitcherView  
  10.         android:id="@+id/slidingLayout"  
  11.         myattr:auto_play="true"  
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="100dip" >  
  14.   
  15.         <LinearLayout  
  16.             android:layout_width="fill_parent"  
  17.             android:layout_height="fill_parent"  
  18.             android:orientation="horizontal" >  
  19.   
  20.             <Button  
  21.                 android:layout_width="fill_parent"  
  22.                 android:layout_height="fill_parent"  
  23.                 android:background="@drawable/image1" />  
  24.   
  25.             <Button  
  26.                 android:layout_width="fill_parent"  
  27.                 android:layout_height="fill_parent"  
  28.                 android:background="@drawable/image2" />  
  29.   
  30.             <Button  
  31.                 android:layout_width="fill_parent"  
  32.                 android:layout_height="fill_parent"  
  33.                 android:background="@drawable/image3" />  
  34.   
  35.             <Button  
  36.                 android:layout_width="fill_parent"  
  37.                 android:layout_height="fill_parent"  
  38.                 android:background="@drawable/image4" />  
  39.         </LinearLayout>  
  40.   
  41.         <LinearLayout  
  42.             android:layout_width="60dip"  
  43.             android:layout_height="20dip"  
  44.             android:layout_alignParentBottom="true"  
  45.             android:layout_alignParentRight="true"  
  46.             android:layout_margin="15dip"  
  47.             android:orientation="horizontal" >  
  48.         </LinearLayout>  
  49.     </com.example.viewswitcher.SlidingSwitcherView>  
  50.       
  51. </LinearLayout>  
也就是说,我们只需要通过设定myattr:auto_play是等于true还是false,就可以决定是否启用自动播放功能,非常简单方便。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 半永久眉失败了怎么办 取环前2天同房了怎么办 怀孕了发现有子宫肌瘤怎么办 宫腔中央性粘连怎么办 孕妇宫腔粘连带怎么办 内膜厚怎么办吃什么好 功血引起的贫血怎么办 吃宫血宁后月经不来了怎么办 孕晚期胎心不好怎么办 胎心不好怎么办让住院 39 5胎心不好怎么办 肺长了一个肿瘤怎么办 血糖高伤口不愈合怎么办 有轻微的狐臭该怎么办 嘴上汗毛太重怎么办 风把裙子吹起怎么办 每天三四点醒来就睡不着怎么办 打游戏手汗太多怎么办 老年人胸闷气短呼吸困难怎么办 冒险岛宠物饿了怎么办 不小心喝了黑墨怎么办 压的双眼皮开了怎么办 割了双眼皮显老怎么办 心脏供血不足怎么办呢 怀孕了哮喘犯了怎么办 喝了电解质不拉怎么办 喝电解质散吐了怎么办 皮鞋买大了一号怎么办 皮鞋买小了挤脚怎么办 新买的皮鞋挤脚怎么办 熊类仓鼠变瘦怎么办 喜利得电锤锁了怎么办 请病假公司不批怎么办 淘宝扣满12分怎么办 吃了霉变的大米怎么办 魅族账号忘了怎么办 魅族账号忘记了怎么办 密保问题忘记了怎么办 yy忘记密保问题怎么办 qq忘记密保问题怎么办 魅族3固件损坏怎么办