安卓开发复习笔记——Gallery组件+ImageSwitcher组件
什么是Gallery?
Gallery是一个水平的列表选择框,它允许用户通过拖动来查看上一个、下一个列表选项。
下图是今天要实现的最终效果:
利用Gallery组件实现的一个横向显示图像列表,可以通过左、右滑动屏幕来切换图像,并加上ImageSwitcher实现一个大图片预览功能。
1、一步一步来吧,首先先解决下上半部分(图像导航)
先来看下效果图,下图是利用Gallery组件实现的一个横向显示图像列表,可以通过左、右滑动屏幕来切换图像。
直接上代码,注释很全。
MainActivity.java
1 package com.example.galleytest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.Gallery; 6 /** 7 * 8 * @author Balla_兔子 9 * 和往常控制使用方法大同小异 10 * 1、获取数据源 11 * 2、配置适配器 12 * 3、绑定适配器 13 */ 14 public class MainActivity extends Activity { 15 16 private Gallery gallery;// 声明gallery对象 17 private ImageAdapter adapter;//声明自定义adapter对象 18 19 // 1、定义数据源 20 private int[] images = { R.drawable.item1, R.drawable.item2, 21 R.drawable.item3, R.drawable.item4, R.drawable.item5, 22 R.drawable.item6, R.drawable.item7, R.drawable.item8, 23 R.drawable.item9, R.drawable.item10, R.drawable.item11, 24 R.drawable.item12 }; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 gallery=(Gallery) findViewById(R.id.gallery);//取得对象 32 33 //2、设置适配器 34 adapter=new ImageAdapter(images, this);//实例化自定义适配器对象 35 36 //3、绑定适配器 37 gallery.setAdapter(adapter); 38 39 } 40 41 }
ImageAdapter.java
1 package com.example.galleytest; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import android.widget.Gallery; 8 import android.widget.ImageView; 9 import android.widget.ImageView.ScaleType; 10 11 //自定义适配器,继承BaseAdapter复写方法 12 public class ImageAdapter extends BaseAdapter { 13 14 private int images[]; 15 private Context context; 16 public ImageAdapter(int res[],Context context){ 17 this.images=res; 18 this.context=context; 19 } 20 @Override 21 //获取资源总长度 22 public int getCount() { 23 return images.length; 24 } 25 26 @Override 27 //根据下标id获取资源对象 28 public Object getItem(int position) { 29 return images[position]; 30 } 31 32 @Override 33 //根据返回下标id 34 public long getItemId(int position) { 35 return position; 36 } 37 38 @Override 39 //根据下标id返回对象的视图view 40 public View getView(int position, View convertView, ViewGroup parent) { 41 //利用ImageView返回图像展示 42 ImageView imageView=new ImageView(context); 43 //设置ImageView背景图 44 imageView.setBackgroundResource(images[position]); 45 //setLayoutParams()这个函数用于代码自定义布局,为创建的view(ImageView)对象设置位置,大小,颜色等一系列的属性 46 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150)); 47 //设置展示缩放风格 48 imageView.setScaleType(ScaleType.FIT_XY); 49 return imageView; 50 } 51 52 }
activity_main.xml
1 <LinearLayout 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 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 android:orientation="vertical" 10 tools:context="com.example.galleytest.MainActivity" > 11 <Gallery 12 android:id="@+id/gallery" 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content" 15 /> 16 17 </LinearLayout>
执行完上面代码我们会发现,当图片滚动到第一张或者最后一张,就自动停止, 我们可以把它设置成无限循环重复的去展示这些图片。
这里我们只需要去改动自定义ImageAdapter适配器里2个位置就可以实现这个无限循环的效果
其一:返回图片资源长度,我们返回的长度不再是数组长度,而是一个巨大数
1 //获取资源总长度 2 public int getCount() { 3 //return images.length; 4 return Integer.MAX_VALUE;//返回一个巨大数 5 }
其二:为ImageView设置图片显示资源,我们用取余的方法,让它实现无限循环
1 public View getView(int position, View convertView, ViewGroup parent) { 2 //利用ImageView返回图像展示 3 ImageView imageView=new ImageView(context); 4 //设置ImageView背景图 5 imageView.setBackgroundResource(images[position%images.length]); //用取余的方法,让它实现无限循环 6 //setLayoutParams()这个函数用于代码自定义布局,为创建的view(ImageView)对象设置位置,大小,颜色等一系列的属性 7 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150)); 8 //设置展示缩放风格 9 imageView.setScaleType(ScaleType.FIT_XY); 10 return imageView; 11 }
无限循环轻松搞定,再试试看效果吧~
2、结合ImageSwitcher组件,使得图片浏览效果更为流畅(可以把ImageSwitcher粗略的想象成ImageView的加强版,它可以带来很多效果,比如图片动画)
直接上代码,依旧人性化注释全面~
MainActivity.java
1 package com.example.galleytest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.animation.AnimationUtils; 7 import android.widget.AdapterView; 8 import android.widget.Gallery; 9 import android.widget.ImageSwitcher; 10 import android.widget.ImageView; 11 import android.widget.ImageView.ScaleType; 12 import android.widget.ViewSwitcher.ViewFactory; 13 /** 14 * 15 * @author Balla_兔子 16 * 和往常控制使用方法大同小异 17 * 1、获取数据源 18 * 2、配置适配器 19 * 3、绑定适配器 20 * 21 * 为Grallery设置监听,因要结合ImageSwitcher,这里需要额外的实现一个图像制造工厂ViewFactory 22 */ 23 public class MainActivity extends Activity implements android.widget.AdapterView.OnItemSelectedListener,ViewFactory{ 24 25 private Gallery gallery;// 声明gallery对象 26 private ImageSwitcher imageSwitcher;//声明一个ImageSwitcher对象 27 private ImageAdapter adapter;//声明自定义adapter对象 28 29 // 1、定义数据源 30 private int[] images = { R.drawable.item1, R.drawable.item2, 31 R.drawable.item3, R.drawable.item4, R.drawable.item5, 32 R.drawable.item6, R.drawable.item7, R.drawable.item8, 33 R.drawable.item9, R.drawable.item10, R.drawable.item11, 34 R.drawable.item12 }; 35 36 @Override 37 protected void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 setContentView(R.layout.activity_main); 40 41 gallery=(Gallery) findViewById(R.id.gallery);//取得对象 42 imageSwitcher=(ImageSwitcher) findViewById(R.id.imageSwitcher);//取得对象 43 44 //添加监听 45 gallery.setOnItemSelectedListener(this); 46 imageSwitcher.setFactory(this); 47 //设置动画效果,图片在imageSwitch的渐入渐出效果 48 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); 49 imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); 50 51 52 //2、设置适配器 53 adapter=new ImageAdapter(images, this);//实例化自定义适配器对象 54 55 //3、绑定适配器 56 gallery.setAdapter(adapter); 57 58 } 59 60 @Override 61 //实现ViewFactory里的制造图像方法,这里需要返回一个view对象,同样的我们可以采用返回ImageView 62 public View makeView() { 63 ImageView imageView=new ImageView(this); 64 imageView.setScaleType(ScaleType.FIT_CENTER);//展示效果 65 return imageView; 66 } 67 68 //Gallery组件的监听器 69 @Override 70 public void onItemSelected(AdapterView<?> parent, View view, int position, 71 long id) { 72 imageSwitcher.setBackgroundResource(images[position%images.length]); 73 } 74 75 @Override 76 public void onNothingSelected(AdapterView<?> parent) { 77 78 } 79 80 }
ImageAdapter.java
1 package com.example.galleytest; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import android.widget.Gallery; 8 import android.widget.ImageView; 9 import android.widget.ImageView.ScaleType; 10 11 //自定义适配器,继承BaseAdapter复写方法 12 public class ImageAdapter extends BaseAdapter { 13 14 private int images[]; 15 private Context context; 16 public ImageAdapter(int res[],Context context){ 17 this.images=res; 18 this.context=context; 19 } 20 @Override 21 //获取资源总长度 22 public int getCount() { 23 //return images.length; 24 return Integer.MAX_VALUE;//返回一个巨大数 25 } 26 27 @Override 28 //根据下标id获取资源对象 29 public Object getItem(int position) { 30 return images[position]; 31 } 32 33 @Override 34 //根据返回下标id 35 public long getItemId(int position) { 36 return position; 37 } 38 39 @Override 40 //根据下标id返回对象的视图view 41 public View getView(int position, View convertView, ViewGroup parent) { 42 //利用ImageView返回图像展示 43 ImageView imageView=new ImageView(context); 44 //设置ImageView背景图 45 imageView.setBackgroundResource(images[position%images.length]); //用取余的方法,让它实现无限循环 46 //setLayoutParams()这个函数用于代码自定义布局,为创建的view(ImageView)对象设置位置,大小,颜色等一系列的属性 47 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150)); 48 //设置展示缩放风格 49 imageView.setScaleType(ScaleType.FIT_XY); 50 return imageView; 51 } 52 53 }
activity_main.xml
1 <LinearLayout 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 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 android:orientation="vertical" 10 tools:context="com.example.galleytest.MainActivity" > 11 <Gallery 12 android:id="@+id/gallery" 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content" 15 /> 16 17 <ImageSwitcher 18 android:id="@+id/imageSwitcher" 19 android:layout_height="wrap_content" 20 android:layout_width="fill_parent" 21 android:layout_marginTop="20dp" 22 ></ImageSwitcher> 23 </LinearLayout>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。