• 用Gallery(画廊)做的图片自动切换(可用作广告图片展示)


    前言:好久没发博文了,今天抽空做了一个图片的自动切换的小例子。先贴上图片,有图才有激情嘛!

    注意:右下角有四个圆点,有四张图片循环切换。

     

    既然图片都上了,那就先来看界面布局是怎么做的吧!

    整个界面才用相对布局,然后是Gallery控件;之后是一个线性布局,线性布局使用水平方式排列,里面有四张图片。

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5 
     6     <Gallery
     7         android:id="@+id/gallery"
     8         android:layout_width="fill_parent"
     9         android:layout_height="wrap_content"
    10         android:soundEffectsEnabled="false"/>
    11 
    12     <LinearLayout
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:layout_alignBottom="@+id/gallery"
    16         android:layout_alignParentRight="true"
    17         android:layout_marginRight="10dp"
    18         android:orientation="horizontal" >
    19 
    20         <ImageView
    21             android:id="@+id/image1"
    22             android:layout_width="wrap_content"
    23             android:layout_height="wrap_content"
    24             android:contentDescription="@string/app_name"
    25             android:src="@drawable/focused" />
    26         <ImageView
    27             android:id="@+id/image2"
    28             android:layout_width="wrap_content"
    29             android:layout_height="wrap_content"
    30             android:contentDescription="@string/app_name"
    31             android:src="@drawable/normal" />
    32         <ImageView
    33             android:id="@+id/image3"
    34             android:layout_width="wrap_content"
    35             android:layout_height="wrap_content"
    36             android:contentDescription="@string/app_name"
    37             android:src="@drawable/normal" />
    38         <ImageView
    39             android:id="@+id/image4"
    40             android:layout_width="wrap_content"
    41             android:layout_height="wrap_content"
    42             android:contentDescription="@string/app_name"
    43             android:src="@drawable/normal" />
    44         
    45     </LinearLayout>
    46 
    47 </RelativeLayout>

    其中第一张图片和其他图片不同,表示当前是第一张图片。

     

    布局说完了,再来看图片切换的实现,图片切换采用Gallery(画廊)控件实现。

    首先自定义一个适配器继承BaseAdapter,用于实现图片的切换。下面是整个适配器的代码:

     

     1 package com.maandroid.galleryproject;
     2 
     3 import android.content.Context;
     4 import android.view.View;
     5 import android.view.ViewGroup;
     6 import android.view.ViewGroup.LayoutParams;
     7 import android.widget.BaseAdapter;
     8 import android.widget.Gallery;
     9 import android.widget.ImageView;
    10 
    11 public class GalleryAdapter extends BaseAdapter {
    12 
    13     private Context context = null;
    14     // 定义一个数组,用来存要显示的图片资源
    15     private int images[] = { R.drawable.meinv1, R.drawable.meinv2,
    16             R.drawable.meinv3, R.drawable.meinv4 };
    17 
    18     public GalleryAdapter(Context context) {
    19         this.context = context;
    20     }
    21 
    22     @Override
    23     public int getCount() {// 取得显示的内容数量,这里设为最大
    24         return Integer.MAX_VALUE;// 资源数量
    25     }
    26 
    27     @Override
    28     public Object getItem(int position) {// 取得显示项
    29         return images[position % images.length];
    30     }
    31 
    32     @Override
    33     public long getItemId(int position) {// 取得项的ID
    34         return images[position % images.length];
    35     }
    36 
    37     @Override
    38     public View getView(int position, View convertView, ViewGroup parent) {
    39         ImageView image = new ImageView(this.context);// 创建ImageView组件
    40         image.setImageResource(images[position % images.length]);// 将指定的资源设置到ImageView组件中
    41         image.setScaleType(ImageView.ScaleType.FIT_XY);// 设置图片根据尺寸显示
    42         image.setLayoutParams(new Gallery.LayoutParams(// 设置图片的宽高
    43                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    44         return image;
    45     }
    46 }

    上面代码的注释已经很详细了,这里需要注意的是

    1 @Override
    2     public int getCount() {// 取得显示的内容数量,这里设为最大
    3         return Integer.MAX_VALUE;// 资源数量
    4     }
    1 images[position % images.length]

    (这里要注意在任何使用数据的时候千万要记得取模.否则就边界值异常了哦。)

    这两个是关键,用于实现图片的循环滑动,不过现在还是手动的,接下来需要让图片自动滑动。

    先来看主界面的代码:

     

      1 package com.maandroid.galleryproject;
      2 
      3 import java.util.Timer;
      4 import java.util.TimerTask;
      5 
      6 import android.app.Activity;
      7 import android.os.Bundle;
      8 import android.os.Handler;
      9 import android.view.KeyEvent;
     10 import android.view.View;
     11 import android.widget.AdapterView;
     12 import android.widget.AdapterView.OnItemSelectedListener;
     13 import android.widget.Gallery;
     14 import android.widget.ImageView;
     15 
     16 public class MainActivity extends Activity {
     17 
     18     //定义画廊控件
     19     private Gallery gallery = null;
     20     //定义图片控件
     21     private ImageView image1, image2, image3, image4;
     22     //当前位置
     23     private int position = 0;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_main);
     29 
     30         //实例化图片控件
     31         image1 = (ImageView) findViewById(R.id.image1);
     32         image2 = (ImageView) findViewById(R.id.image2);
     33         image3 = (ImageView) findViewById(R.id.image3);
     34         image4 = (ImageView) findViewById(R.id.image4);
     35         //实例化画廊控件
     36         gallery = (Gallery) findViewById(R.id.gallery);
     37         //装载内容
     38         gallery.setAdapter(new GalleryAdapter(this));
     39         //设置项的选中监听
     40         gallery.setOnItemSelectedListener(new OnItemSelectedListenerImpl());
     41         //启动线程
     42         timer.schedule(task, 3000, 3000);
     43     }
     44 
     45     //项的监听实现
     46     private class OnItemSelectedListenerImpl implements OnItemSelectedListener {
     47 
     48         @Override
     49         public void onItemSelected(AdapterView<?> parent, View view,
     50                 int position, long id) {
     51             switch (position % 4) {
     52             case 0:
     53                 //设置显示图片
     54                 image1.setImageResource(R.drawable.focused);
     55                 image2.setImageResource(R.drawable.normal);
     56                 image3.setImageResource(R.drawable.normal);
     57                 image4.setImageResource(R.drawable.normal);
     58                 break;
     59             case 1:
     60                 image1.setImageResource(R.drawable.normal);
     61                 image2.setImageResource(R.drawable.focused);
     62                 image3.setImageResource(R.drawable.normal);
     63                 image4.setImageResource(R.drawable.normal);
     64                 break;
     65             case 2:
     66                 image1.setImageResource(R.drawable.normal);
     67                 image2.setImageResource(R.drawable.normal);
     68                 image3.setImageResource(R.drawable.focused);
     69                 image4.setImageResource(R.drawable.normal);
     70                 break;
     71             case 3:
     72                 image1.setImageResource(R.drawable.normal);
     73                 image2.setImageResource(R.drawable.normal);
     74                 image3.setImageResource(R.drawable.normal);
     75                 image4.setImageResource(R.drawable.focused);
     76                 break;
     77             default:
     78                 break;
     79             }
     80         }
     81 
     82         @Override
     83         public void onNothingSelected(AdapterView<?> parent) {
     84             // TODO Auto-generated method stub
     85 
     86         }
     87     }
     88 
     89     //销魂线程
     90     @Override
     91     protected void onDestroy() {
     92         timer.cancel();
     93         super.onDestroy();
     94     }
     95 
     96     // 设置自动循环的线程
     97     private static final int timerAnimation = 1;
     98     private final Handler mHandler = new Handler() {
     99         public void handleMessage(android.os.Message msg) {
    100             switch (msg.what) {
    101             case timerAnimation:
    102                 gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
    103                 position++;
    104                 break;
    105             default:
    106                 break;
    107             }
    108         };
    109     };
    110     private final Timer timer = new Timer();
    111     private final TimerTask task = new TimerTask() {
    112         public void run() {
    113             mHandler.sendEmptyMessage(timerAnimation);
    114         }
    115     };
    116 }

    这里自动切换用线程来实现,停留时间设置为3秒(可以根据需要来实现)

    1 //启动线程
    2         timer.schedule(task, 3000, 3000);

    在线程里写了一个,向右滑动的操作;每次运行一次都向右滑动一次,以此来实现自动切换图片。同时每次线程运行一次,当前位置都加一。

    1 gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
    2                 position++;

    到这里图片的自动循环切换就讲完了。接下来,来看右下角的四个圆点是怎么实现的?

    这里先对gallery控件注册了一个OnItemSelectedListener监听事件,然后在这个事件里实现四个圆点的显示。

    1 //设置项的选中监听
    2         gallery.setOnItemSelectedListener(new OnItemSelectedListenerImpl());
     1 //项的监听实现
     2     private class OnItemSelectedListenerImpl implements OnItemSelectedListener {
     3 
     4         @Override
     5         public void onItemSelected(AdapterView<?> parent, View view,
     6                 int position, long id) {
     7             switch (position % 4) {
     8             case 0:
     9                 //设置显示图片
    10                 image1.setImageResource(R.drawable.focused);
    11                 image2.setImageResource(R.drawable.normal);
    12                 image3.setImageResource(R.drawable.normal);
    13                 image4.setImageResource(R.drawable.normal);
    14                 break;
    15             case 1:
    16                 image1.setImageResource(R.drawable.normal);
    17                 image2.setImageResource(R.drawable.focused);
    18                 image3.setImageResource(R.drawable.normal);
    19                 image4.setImageResource(R.drawable.normal);
    20                 break;
    21             case 2:
    22                 image1.setImageResource(R.drawable.normal);
    23                 image2.setImageResource(R.drawable.normal);
    24                 image3.setImageResource(R.drawable.focused);
    25                 image4.setImageResource(R.drawable.normal);
    26                 break;
    27             case 3:
    28                 image1.setImageResource(R.drawable.normal);
    29                 image2.setImageResource(R.drawable.normal);
    30                 image3.setImageResource(R.drawable.normal);
    31                 image4.setImageResource(R.drawable.focused);
    32                 break;
    33             default:
    34                 break;
    35             }
    36         }

    这里对用position%4,这样就保证结果在0、1、2、3四个数字波动,还有因为有四个圆点,所以是模4(可根据需要自己改变数字)。

    最后根据结果设置四张图片的显示。

    注意事项:

    1、在真机上滑动的时候,会产生声音,需要在gallery的布局里加上下面的属性

    1 android:soundEffectsEnabled="false"

    2、还有gallery的布局属性不能设置图片之间的间隙,不然将无法实现图片的自动切换。如下

    1 android:spacing="5dp"

    程序代码我已经上传到CSDN了,有需要的去下载吧!
    http://download.csdn.net/detail/ouyangjiangtao/5347791

    欢迎大家访问我的个人博客网站:http://www.cnpath.com

    附上其他几张程序截图!(有美女看哦!)

    作者:江阳小道
    本博客中未标明原文地址的文章归作者江阳小道,欢迎转载,但请在文章页面明显位置给出原文连接。Thanks!
    如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    iPhone将NSString转换编码集为gb2312或者gbk的方法
    iOS下微信语音播放之切换听筒和扬声器的方法解决方案
    苹果开发者各地区联系电话
    iOS开发中,应用内直接跳转到Appstore
    高亮显示UILabel中的子串
    UML
    All Classic Bluetooth profile for iPhone
    智能穿戴设备移动APP端与外设数据传输协议功能模块CMD&ACK表
    Mac 使用技巧分享
    git branch管理小结
  • 原文地址:https://www.cnblogs.com/oyjt/p/3068315.html
Copyright © 2020-2023  润新知