使用Gallery 和 ImageSwitcher 制作图片浏览器
Gallery介绍
我们有时候在手机上或者PC上看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸来触发其他事件响应。同样的,在Android中也提供这种实现,这就是通过Gallery在UI上实现缩略图浏览器。
-------------------------
谷歌已经将Gallery列为过期的控件,建议使用HorizonScrollView或者ViewPager。
-------------------------
查看源码不难发现 ArrayAdapter 和 SimpleAdapter 都继承了 BaseAdapter。
所以,我们也可以自己定义一个适配器!自定义的好处是自由度、灵活性会更大。
BaseAdapter中的重要方法
(1)public int getCount()——返回一定义的数据源的总数量
(2)public Object getItem(int position)public long getItemId(int position)
——告诉适配器取得目前容器中的数据ID和对象
(3)public View getView(int position,View convertView,ViewGroupparent)——取得目前要显示的图像View,传入数组ID值使之读取与成像。
-----------------------------------
使用 Gallery 浏览图片的步骤:
1. 在 main.xml 中添加 Gallery标签。
2. 在 MainActivity 中创建数据源,这里就是 int数组存放图片id。
3. 自定义适配器。创建一个新类 ImageAdapter ,继承 BaseAdapter。重写getView(int position, View view, ViewGroup viewGroup)方法。
4. 在 MainActivity加载适配器。
自定义适配器的步骤
1. 创建一个新类 IamgeAdapter ,继承BaseAdapter。
2. 为了接收参数,需要构建有参的构造方法:private  int[]res; //用于接收数据源private Context context;//上下文信息,ImageView的初始化会用到//构造有参构造方法public ImageAdapter(int[]res,Context context){this.res=res;this.context=context;}
3. 重写getView(),把图片ID(这里是res[position])转变为 ImageView,并返回 ImageView:
public View getView(int position, View view, ViewGroup viewGroup) {ImageView image = new ImageView(context);image.setBackgroundResource(res[position]);//设置图片(ImageView)在Gallery中的缩略图的大小image.setLayoutParams(new Gallery.LayoutParams(400,300));//宽是400,高是300//设置缩放比例(scale)采取的类型image.setScaleType(ImageView.ScaleType.FIT_XY);//横向X-Y轴的拉伸return image;
}
其他方法的重写,写法固定:
public int getCount() {return res.length;
}
public Object getItem(int position) {return res[position];
}
public long getItemId(int position) {return position;
}
无限轮播图片的实现:
1. 改写 ImageAdapter 适配器的 onCount()方法,使它返回整数最大值 Integer.MAX_VALUE。
2. 改写 getView():image.setBackgroundResource(res[position%res.length]);
由于数组res的下标的上限是 Integer.MAX_VALUE,所以 position%res.length 的运算结果是一个循环数组。这样就实现了循环播放图片。
---------------------------------------------
ImageSwitcher实现大图浏览的步骤:
1. 在 main.xml 中添加 ImageSwitcher标签。
2. 让 MainActivity 继承接口 ViewFactory。重写方法 makeView():public View makeView() {ImageView image = new ImageView(this);//初始化ImageView对象image.setScaleType(ImageView.ScaleType.FIT_CENTER);//保持宽高比例,并且居中显示return image;}重写 onItemSelected(),只写一句:imageSwitcher.setBackgroundResource(res[position%res.length]);//imageSwitch加载图片资源。
3. 在 MainActivity 中创建和初始化 ImageSwitcher 的对象。之后加载工厂:imageSwitcher.setFactory(this);然后就是加载动画效果,比如:imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));//淡入的效果
ImageSwitcher 大图浏览
ImageSwitcher 和 ImageView 的功能有点类似,他们都可以用于显示图片,区别在于 ImageSwitcher 的效果更炫,它可以指定图片切换时的动画效果。
为了让 ImageSwitcher 加载图片,必须让MainActivity实现接口ViewFactory。
---------------------------------------
ViewFactory的使用
ImageSwitcher 粗略的理解就是 ImageView 的选择器,它需要设置 ViewFactory。一般情况下,我们让该 ViewFactory 的 makeView()方法返回 ImageView。
-----------------------------------
为ImageSwitcher加入动画
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));//淡入的效果
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));//淡出的效果
 1 //gallery实现图片大图预览的循环播放
 2 //ImageSwitcher 和 ImageView 的功能有点类似,他们都可以用于显示图片,
 3 //区别在于 ImageSwitcher 的效果更炫,它可以指定图片切换时的动画效果。
 4 //ImageSwitcher实现ViewFactory,监听事件 OnItemSelectedListener
 5 public class MainActivity extends Activity implements OnItemSelectedListener,
 6         ViewFactory {
 7     // 准备数据源
 8     private int[] res = { R.drawable.item1, R.drawable.item2, R.drawable.item3,
 9             R.drawable.item4, R.drawable.item5, R.drawable.item6,
10             R.drawable.item7, R.drawable.item8, R.drawable.item9,
11             R.drawable.item10, R.drawable.item11, R.drawable.item12 };
12     private Gallery gallery;
13     private ImageAdapter adapter;
14
15
16     private ImageSwitcher imageSwitcher;
17
18     // ArrayAdapter<String> adapter;
19     // SimpleAdapter adapter2;
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.main);
24         gallery = (Gallery) findViewById(R.id.gallery);
25         imageSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
26
27         // gallery加载适配器
28         adapter = new ImageAdapter(res, this);
29         gallery.setAdapter(adapter);
30         gallery.setOnItemSelectedListener(this);
31
32         imageSwitcher.setFactory(this);
33         //添加动画效果
34         imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
35                 android.R.anim.fade_in));
36         imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
37                 android.R.anim.fade_out));
38
39     }
40
41     @Override
42     public void onItemSelected(AdapterView<?> parent, View view, int position,
43             long id) {
44         // TODO Auto-generated method stub
45
46         imageSwitcher.setBackgroundResource(res[position % res.length]);
47     }
48
49     @Override
50     public void onNothingSelected(AdapterView<?> parent) {
51         // TODO Auto-generated method stub
52
53     }
54
55     @Override
56     public View makeView() {
57         // TODO Auto-generated method stub
58         ImageView imageView = new ImageView(this);
59         imageView.setScaleType(ScaleType.FIT_CENTER);// 大图预览
60         return imageView;
61     }
62
63 }

 1 public class ImageAdapter extends BaseAdapter {
 2     private int[] res;
 3     private Context context;
 4
 5     public ImageAdapter(int[] res, Context context) {
 6         // TODO Auto-generated constructor stub
 7         this.res = res;
 8         this.context = context;
 9     }
10
11     // 返回已定义的数据源总数量
12     @Override
13     public int getCount() {
14         // TODO Auto-generated method stub
15
16         //return res.length;
17         return Integer.MAX_VALUE;//循环播放
18     }
19
20     // 告诉适配器取得目前容器中的数据ID和对象
21     @Override
22     public Object getItem(int position) {
23         // TODO Auto-generated method stub
24         return res[position];
25     }
26
27     @Override
28     public long getItemId(int position) {
29         // TODO Auto-generated method stub
30         return position;
31     }
32
33     // 取得目前欲显示的图像view,传入数组ID值使之读取与成像
34     @Override
35     public View getView(int position, View convertView, ViewGroup parent) {
36         // TODO Auto-generated method stub
37         ImageView imageView = new ImageView(context);
38         imageView.setBackgroundResource(res[position%res.length]);//循环播放
39         imageView.setLayoutParams(new Gallery.LayoutParams(100,50));//设置图像大小
40
41         imageView.setScaleType(ScaleType.FIT_XY);
42         return imageView;
43     }
44
45 }



转载于:https://www.cnblogs.com/my334420/p/6718486.html

Android攻城狮Gallery和ImageSwitcher制作图片浏览器相关推荐

  1. Android实用笔记——使用Gallery和ImageSwitcher制作图片浏览器

    2019独角兽企业重金招聘Python工程师标准>>> 1.介绍 Gallery:我们有时候在手机或者PC上看到图片,可以通过鼠标或手指触摸来移动它,产生动态的图片滚动效果,还可以根 ...

  2. 写给即将/正在找工作的Android攻城狮

    写给即将/正在找工作的Android攻城狮 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 这段时间从北上广深杭不断传来一两个月找不到工作的消息,我一 ...

  3. 写给即将正在找工作的Android攻城狮,算法太TM重要了

    一.认识鸿蒙 鸿蒙 微内核是基于微内核的全场景分布式OS,可按需扩展,实现更广泛的系统安全,主要用于物联网,特点是低时延,甚至可到毫秒级乃至亚毫秒级. 鸿蒙OS实现模块化耦合,对应不同设备可弹性部署, ...

  4. Android攻城狮ListView

    适配器: 数据适配器:把复杂的数据填充在指定的视图界面上ArrayAdapter 数组适配器 用于绑定格式单一的数据 数据源:可以是集合或数组 SimpleAdapter 简单适配器:用于绑定格式复杂 ...

  5. Android攻城狮GestureDetector和GestureOverlayView

    手势识别 可以通过以下两种方式实现: 1. 使用GestureDetector 2. 使用GestureOverlayView(属于线程的控件)手势交互过程(原理): 1. 触屏一刹那,触发 Moti ...

  6. Android攻城狮fragment

    1 //1,fragment静态加载:MainActivity MainActivty1_2 Myfragment1 2 //2,fragment动态加载 :MainActivity Myfragme ...

  7. Android攻城狮ScrollView

    ScrollView 滚动视图 滚动视图是指当前拥有很多内容,屏幕显示不完整时,需要通过滚动来显示完整的视图. ----------------------------- ScrollBar分两种: ...

  8. Android攻城狮ViewFlipper

    使用ViewFlipper实现屏幕切换动画效果. ViewFlipper和ViewPager一样,都是Android自带的一个多页面管理控件,不同的是ViewPager是手动切换页面,而ViewFli ...

  9. Android攻城狮数据存储之SharedPreferences

    Android的四种数据存储方式: 1. SharedPreferences 2. SQLite 3. Content Provider 4. File --------------------- S ...

最新文章

  1. Dataset之Rotten Tomatoes:Rotten Tomatoes影评数据集简介、下载、使用方法之详细攻略
  2. 使用分页插件PageHelper
  3. createelement 设置id_还记得你的第一个网络ID是什么吗?
  4. 推荐使用typora
  5. STM32串口寄存器操作(转)
  6. beautifulsoup_BeautifulSoup爬虫了解一下
  7. Python监控Windows下的文件变化
  8. ClassNotFoundException: javax.validation.ValidatorFactory
  9. ACM题目中输入数据的处理(C++语言版)
  10. nodemcu引脚_一、ESP32开发板NodeMCU-32S简介
  11. java key value 数据类型_JAVA面试锦囊(一)
  12. 如何关闭父窗体?C#(已解决)
  13. 优先级表和Ascll表
  14. 计算机专业英语教程第七版,经典_计算机专业英语教程.pdf
  15. python综合程序设计-基于树莓派的python GPIO编程-常用函数综合整理
  16. Java实现增删改查系统代码(全~纯干货)
  17. Python编程基础之Python语言的基础知识(上)
  18. RPC框架Kitex入门
  19. 阿里云MNS工具 java-messaging-lib 之万恶的System.out.prinln
  20. 获取已安装设备的高级信息

热门文章

  1. 同样是查询语言,它和 SQL 竟然有这么多不同
  2. 【趣话编程】如果张东升是个程序员
  3. 朱峰谈概念设计(四):游戏和电影的不同
  4. 第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
  5. SQL Server语句大全(增删改查数据、创建表、删除表、修改表)
  6. .Net软件工程师必备面试题134道
  7. goldengate使用ASM存放trail文件注意事项
  8. mysql的my.cnf
  9. MySQL下的SQL语句
  10. 【面试经历】再惠网络、远景能源、东软集团