• Android学习笔记26:图片切换控件ImageSwitcher的使用


      在Windows操作系统中,要查看多张图片,可以通过使用“Windows照片查看器”在“上一张”和“下一张”之间切换,进行多张图片的浏览。

      在Android中,可以通过使用图片切换控件ImageSwitcher来实现浏览多张图片的功能。下面我们就通过一个实际的例子来说明图片切换控件ImageSwitcher的使用方法。

     

    1.界面布局

      在xml布局文件中,我们使用LinearLayout对整个界面进行垂直布局。在界面的顶端设置了一个水平居中的ImageSwitcher控件,用来显示多张图片。在ImageSwitcher控件的下面使用LinearLayout水平布局设置四个ImageButton按钮,在点击这些按钮时分别用于实现右旋图片、显示上一张图片、显示下一张图片、左旋图片效果。整个布局文件很简单,具体源码如下:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:orientation="vertical"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent" >
     6 
     7     <ImageSwitcher
     8         android:id="@+id/imageSwitcher"
     9         android:layout_marginTop="5dp"
    10         android:layout_gravity="center"
    11         android:layout_width="wrap_content"
    12         android:layout_height="wrap_content"    ></ImageSwitcher>
    13 
    14     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    15         xmlns:tools="http://schemas.android.com/tools"
    16         android:orientation="horizontal"
    17         android:layout_marginTop="5dp"
    18         android:layout_width="match_parent"
    19         android:layout_height="match_parent"     >
    20     
    21         <!-- 右旋箭头 -->
    22         <ImageButton
    23             android:id="@+id/rightrotatearrow"
    24             android:layout_marginLeft="30dp"
    25             android:layout_width="wrap_content"
    26             android:layout_height="wrap_content"
    27             android:src="@drawable/rightrotatearrow"    ></ImageButton>
    28         
    29         <!-- 前一个箭头 -->
    30         <ImageButton
    31             android:id="@+id/forwardarrow"
    32             android:layout_width="wrap_content"
    33             android:layout_height="wrap_content"
    34             android:src="@drawable/forwardarrow"    ></ImageButton>
    35     
    36         <!-- 下一个箭头 -->
    37         <ImageButton
    38             android:id="@+id/nextarrow"
    39             android:layout_width="wrap_content"
    40             android:layout_height="wrap_content"
    41             android:src="@drawable/nextarrow"    ></ImageButton>
    42         
    43         <!-- 左旋箭头 -->
    44         <ImageButton
    45             android:id="@+id/liftrotatearrow"
    46             android:layout_width="wrap_content"
    47             android:layout_height="wrap_content"
    48             android:src="@drawable/liftrotatearrow"    ></ImageButton>
    49         
    50     </LinearLayout>
    51     
    52 </LinearLayout>

      程序运行后的效果如图1所示。

    图1 主界面

     

    2.ViewFactory接口

      要将图片显示在ImageSwitcher控件中,必须为ImageSwitcher类设置一个ViewFactory,用来将显示的图片和父窗口区分开来。这可以通过如下方法来实现:

      mImageSwitcher.setFactory();

      此外,我们还需要实现ViewSwitcher.ViewFactory接口中的makeView()抽象方法,通过该方法可以返回一个ImageView对象,所有图片都将通过该ImageView对象来进行显示。具体实现方法如下:

    1     /*
    2      * Function   :    makeView()
    3      * Describe      :      将所有图片通过ImageView来显示
    4      * Author       :    博客园-依旧淡然
    5      */
    6     public View makeView() {
    7         return new ImageView(this);
    8     }

    3.存储图片资源

      在《Android学习笔记25:画廊控件Gallery的使用》(http://www.cnblogs.com/menlsh/archive/2013/02/26/2934434.html)中,我们是通过使用一个继承自BaseAdapter类的派生类ImageAdapter来存储图片资源的。 

      在该实例中,我们将新建一个ArrayList对象来存储图片资源,方法如下:

      List<Drawable> list = new ArrayList<Drawable>();

      然后,可以使用list.add()方法将图片资源加载到该ArrayList对象中,具体方法如下:

    1     //将图片资源加载到ArrayList中
    2     list.add(getResources().getDrawable(R.drawable.image1));
    3     list.add(getResources().getDrawable(R.drawable.image2));
    4     list.add(getResources().getDrawable(R.drawable.image3));
    5     list.add(getResources().getDrawable(R.drawable.image4));

      在该实例中,我们往ArrayList中加载了4张资源图片。

    4.获取图片资源

      当我们点击“上一张”和“下一张”按钮时,需要获取图片资源进行显示,这该如何实现呢?

      通过查看ImageSwitcher的API帮助文档(http://developer.android.com/reference/android/widget/ImageSwitcher.html),我们可以看出向ImageSwitcher加载图片有以下三种方式:

      (1)public void setImageDrawable(Drawable drawable);

      (2)public void setImageResource(int resid);

      (3)public void setImageURI(Uri uri);

      其中,setImageDrawable()方法通过Drawable对象来获取图片资源;setImageResource()方法通过图片资源Id来获取图片资源;setImageURI()方法通过图片的Uri路径来获取图片资源。

      在该实例中,我们选择使用setImageDrawable()方法来获取图片资源,这也就是为什么我们往ArrayList对象中存储图片时使用Drawable对象的原因。

     

    5.按键处理

      在该实例中,我们还需要实现OnClickListener接口的onClick()方法,对四个按键进行事件监听,具体实现方法如下:

     1     /*
     2      * Function   :    事件监听处理
     3      * Author       :    博客园-依旧淡然
     4      */
     5     public void onClick(View v) {
     6         switch (v.getId()) {
     7         case R.id.forwardarrow:           //向前箭头按钮按键处理
     8             index--;
     9             if (index < 0) {
    10                 index = list.size() - 1;
    11             }
    12             mImageSwitcher.setImageDrawable(list.get(index));
    13             break;
    14         case R.id.nextarrow:              //向后箭头按钮按键处理
    15             index++;
    16             if (index >= list.size()) {
    17                 index = 0;
    18             }
    19             mImageSwitcher.setImageDrawable(list.get(index));
    20             break;
    21         case R.id.liftrotatearrow:        //左旋箭头按钮按键处理
    22             //TO DO
    23             break;
    24         case R.id.rightrotatearrow:      //右旋箭头按钮按键处理
    25             //TO DO
    26             break;
    27         }
    28     }

      其中,变量index用于对图片进行索引,实现图片的循环显示,即当显示到最后一张图片时,再次点击“下一张”,则将图片索引号重置为0,然后重新显示第一张图片;当显示第一张图片时,再次点击“上一张”,则将图片的索引号重置为最大,然后显示最后一张图片。

      在该实例中,并未对“左旋”和“右旋”按钮进行按键处理。要实现图片的旋转效果,请见博文《Android学习笔记11:图像的平移、旋转及缩放》(http://www.cnblogs.com/menlsh/archive/2012/12/02/2798802.html)。

    作者:依旧淡然
    邮箱:menlsh@163.com
    本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。
  • 相关阅读:
    跟踪内核启动过程CONFIG_DEBUG_LL【转自】
    为什么可能导致睡眠的函数都不能在中断上下文中使用呢?【转】
    可重入和不可重入【转】
    中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)--中断中的延迟delay与printk函数的冲突【转】
    Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】
    仿照linux dpm机制,实现自己的dpm【转】
    (二)内核锁的使用之信号量【转】
    linux dpm机制分析(下)【转】
    linux dpm机制分析(上)【转】
    python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】
  • 原文地址:https://www.cnblogs.com/menlsh/p/2939582.html
Copyright © 2020-2023  润新知