热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidViewPager相册横向移动的实现方法

本篇文章小编为大家介绍,AndroidViewPager相册横向移动的实现方法。需要的朋友参考下

当我们第一次下载QQ并且打开的时候,会有一个新手引导,引导是几张图片,再加上一些文字说明,向右滑动,直到结束,今天一大早起来研究了一下关于此种效果的实现之ViewPager控件。

下面这个例子将用ViewPager实现横向移动相册,ViewPager有一个对应的PagerAdapter,用于绑定数据;我们需要继承此类并实现自己的功能。

1、首先定义一个显示项所需要使用的数据对象ImageItem

代码如下:

public class ImageItem {
 private int id;// 资源id
 private String name;// 显示的名称
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public ImageItem(int id, String name) {
  super();
  this.id = id;
  this.name = name;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
}

2、ViewPager中每一面为一个Item,所以在layout目录下定义一个ViewPager的每一页的Item,名为pageritem.xml

代码如下:


3、新建一个java文件,对应ViewPager的每一项Item

代码如下:

public class ViewpagerItem extends FrameLayout {
 private ImageView imageview;// 显示图片的ImageView
 private TextView textview;
 private Bitmap bitmap;// 图片对应的Bitmap
 private ImageItem imageitem;// 每一个图片项对象

 public ViewpagerItem(Context context) {
  super(context);
  setViews();
 }
 public ViewpagerItem(Context context, AttributeSet attrs) {
  super(context, attrs);
  setViews();
 }

 public void setData(ImageItem item) {// 用ImageItem填充数据
  this.imageitem = item;
  int resid = item.getId();
  String name = item.getName();
  imageview.setImageResource(resid);
  textview.setText(name);
 }

 public void reload() {// 重新载入数据
  int resid = imageitem.getId();
  imageview.setImageResource(resid);
 }

 public void recycle() {// 回收数据
  imageview.setImageBitmap(null);
  if (this.bitmap == null || this.bitmap.isRecycled()) {
   return;
  }
  this.bitmap.recycle();
  this.bitmap = null;
 }

 public void setViews() {
  LayoutInflater infalter = LayoutInflater.from(getContext());
  View view = infalter.inflate(R.layout.pageritem, null);
  textview = (TextView) view.findViewById(R.id.textView);
  imageview = (ImageView) view.findViewById(R.id.imgview);

  addView(view);
 }
}

4、新建一个数据填充器PagerItemAdapter,继承自PagerAdapter

代码如下:

public class PagerItemAdapter extends PagerAdapter {
 private Context context;
 private ImageItem[] image;

 public PagerItemAdapter(Context context, ImageItem[] image) {
  this.cOntext= context;
  this.image = image;
  hashMap = new HashMap();
 }

 private HashMap hashMap;// 保存相片的id以及对应的ViewpagerItem

 @Override
 public int getCount() {
  return image.length;
 }

 @Override
 public boolean isViewFromObject(View arg0, Object arg1) {
  return arg0 == arg1;
 }

 @Override
 public void finishUpdate(ViewGroup container) {
  super.finishUpdate(container);
 }

 @Override// 初始化一个ViewpagerItem,如果已经存在就重新载入,没有的话new一个
 public Object instantiateItem(ViewGroup container, int position) {
  ViewpagerItem item;
  if (hashMap.containsKey(position)) {
   item = hashMap.get(position);
   item.reload();
  } else {
   item = new ViewpagerItem(context);
   ImageItem itemimg = image[position];
   item.setData(itemimg);
   hashMap.put(position, item);
   ((ViewPager) container).addView(item);
  }
  return item;
 }

 @Override// 当我们左右滑动图片的时候会将图片回收掉
 public void destroyItem(View container, int position, Object object) {
  ViewpagerItem item = (ViewpagerItem) object;
  item.recycle();
 }
}

5、在main.xml文件中添加一个ViewPager控件

代码如下:

  android:id="@+id/viewpager"
  android:layout_
  android:layout_ />

6、修改MainActivity如下:

代码如下:

public class MainActivity extends Activity {
 private final static int RES[] = { R.drawable.p1, R.drawable.p2 };// p1,p2为drawable文件夹下的两张图片
 private ViewPager viewpager;
 private PagerItemAdapter adapter;
 private ImageItem[] item;

 private void setView(){
  item = new ImageItem[2];
  item[0] = new ImageItem(RES[0], "page1");
  item[1] = new ImageItem(RES[1], "page2");
  viewpager = (ViewPager) findViewById(R.id.viewpager);
  adapter = new PagerItemAdapter(getApplicationContext(), item);
  viewpager.setAdapter(adapter);
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  setView();
 }
}


 运行程序,左右滑动屏幕出现如下效果!


推荐阅读
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何使用开源工具ChkBugReport来解析和分析Android设备的Bugreport。ChkBugReport能够将复杂的Bugreport转换为易于阅读的HTML报告,并提供详细的图表和分析结论。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 本文详细介绍了 Android 开发中常用的单位 dip(设备独立像素)、px(像素)、pt(点)和 sp(可缩放像素),并解释了它们在不同屏幕密度下的应用。 ... [详细]
  • 本文介绍了多种常用的开发工具,包括PyCharm、Appium、Jenkins、Postman、Fiddler、Charles、Airtest、Android Studio、Navicat和Typora,并提供了它们的基本使用方法。 ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 近年来,区块链技术备受关注,其中比特币(Bitcoin)功不可没。尽管数字货币的概念早在上个世纪就被提出,但直到比特币的诞生,这一概念才真正落地生根。本文将详细探讨比特币、以太坊和超级账本(Hyperledger)的核心技术和应用场景。 ... [详细]
  • 本文介绍了 LaiFengcode 在 GitHub 上的两个主要开源项目:SopCastComponent 和 iOS 相关组件。 ... [详细]
  • 使用外部样式表实现盒子居中对齐
    本文介绍如何在HTML文件中引入外部CSS样式表,并通过CSS实现盒子的居中对齐。 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • 本文介绍了如何使用线段树实现区间加法和区间查询操作,包括详细的代码实现和解释。 ... [详细]
  • 解决Eclipse中缺少Android SDK和AVD管理器的问题
    本文介绍了如何在Eclipse的Window菜单中添加Android SDK和AVD管理器选项,通过自定义透视图中的命令组可用性设置来实现。 ... [详细]
  • http:blog.csdn.netzeo112140articledetails7675195使用TCPdump工具,抓TCP数据包。将数据包上传到PC,通过Wireshark查 ... [详细]
  • 如何使用strip()方法去除字符串首尾的空白字符
    本文介绍如何使用Python中的strip()方法来去除字符串首尾的空白字符,包括空格、制表符和换行符。 ... [详细]
  • 线段树,注 ... [详细]
author-avatar
castellaniygw_623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有