ViewPager 详解(一)—基本入门

ViewPager 详解(一)—基本入门前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager分几篇写,研究的哪个程度就写到哪个程度吧。今天是第一篇,基本入门篇。相关文章:1、《ViewPager详解(一)—基本入门》2、《ViewPager详…

大家好,又见面了,我是你们的朋友全栈君。

前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇写,研究的哪个程度就写到哪个程度吧。今天是第一篇,基本入门篇 。

 

 

相关文章:

1、《ViewPager 详解(一)—基本入门》

2、《ViewPager 详解(二)—详解四大函数》

3、《ViewPager 详解(三)—PagerTabStrip与PagerTitleStrip添加标题栏的异同》

4、《ViewPager 详解(四)—-自主实现滑动指示条》

5、《ViewPager 详解(五)—–使用Fragment实现ViewPager滑动》

 

首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再结合API仔细讲讲为什么要这么写。

效果图:

实现了三个view间的相互滑动

                     第一个VIEW向第二个VIEW滑动       第二个VIEW向第三个VIEW滑动

 ViewPager 详解(一)---基本入门  ViewPager 详解(一)---基本入门

一、新建项目,引入ViewPager控件

ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

1.在主布局文件里加入

 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context="com.example.testviewpage_1.MainActivity" >

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" />

</RelativeLayout>

 

其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置

2、新建三个layout,用于滑动切换的视图

从效果图中也可以看到,我们的三个视图都非常简单,里面没有任何的控件,大家当然可以往里添加各种控件,但这里是个DEMO,只详解原理即可,所以我这里仅仅用背景来区别不用layout布局。

布局代码分别如下:

layout1.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >
    

</LinearLayout>

layout2.xml

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff00"
    android:orientation="vertical" >
    

</LinearLayout>

layout3.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff"
    android:orientation="vertical" >
    

</LinearLayout> 

 

二、代码实战

先上整体代码,然后逐步讲解。

package com.example.testviewpage_1;
/**
 * @author  harvic
 * @date 2014.8.9
 */
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class MainActivity extends Activity {

	private View view1, view2, view3;
	private ViewPager viewPager;  //对应的viewPager
	
	private List<View> viewList;//view数组
   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        LayoutInflater inflater=getLayoutInflater();
        view1 = inflater.inflate(R.layout.layout1, null);
        view2 = inflater.inflate(R.layout.layout2,null);
        view3 = inflater.inflate(R.layout.layout3, null);
        
        viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
		viewList.add(view1);
		viewList.add(view2);
		viewList.add(view3);
		
		
		PagerAdapter pagerAdapter = new PagerAdapter() {
			
			@Override
			public boolean isViewFromObject(View arg0, Object arg1) {
				// TODO Auto-generated method stub
				return arg0 == arg1;
			}
			
			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return viewList.size();
			}
			
			@Override
			public void destroyItem(ViewGroup container, int position,
					Object object) {
				// TODO Auto-generated method stub
				container.removeView(viewList.get(position));
			}
			
			@Override
			public Object instantiateItem(ViewGroup container, int position) {
				// TODO Auto-generated method stub
				container.addView(viewList.get(position));
				
				
				return viewList.get(position);
			}
		};
		
		
		viewPager.setAdapter(pagerAdapter);
		
    }


}

代码量很小,全部放在了OnCreate()函数中。

 

1、先看声明的变量的意义:

 

 

private View view1, view2, view3;
private List<View> viewList;//view数组
private ViewPager viewPager;  //对应的viewPager

 

首先viewPager对应 <android.support.v4.view.ViewPager/>控件。

view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml

viewList是一个View数组,盛装上面的三个VIEW

2、接下来是他们的初始化过程:

 

viewPager = (ViewPager) findViewById(R.id.viewpager);
LayoutInflater inflater=getLayoutInflater();
view1 = inflater.inflate(R.layout.layout1, null);
view2 = inflater.inflate(R.layout.layout2,null);
view3 = inflater.inflate(R.layout.layout3, null);

viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);

初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到viewList中

 

3、PageAdapter——PageView的适配器

 

适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。

PageAdapter 必须重写的四个函数:

 

  • boolean isViewFromObject(View arg0, Object arg1)
  • int getCount() 
  • void destroyItem(ViewGroup container, int position,Object object)
  • Object instantiateItem(ViewGroup container, int position)

 

先看看各个函数,我们上面都做了什么吧:

 

@Override
public int getCount() {
	// TODO Auto-generated method stub
	return viewList.size();
}

getCount():返回要滑动的VIew的个数

 

 

@Override
public void destroyItem(ViewGroup container, int position,
		Object object) {
	// TODO Auto-generated method stub
	container.removeView(viewList.get(position));
}

destroyItem():从当前container中删除指定位置(position)的View;

 

@Override
public Object instantiateItem(ViewGroup container, int position) {
	// TODO Auto-generated method stub
		container.addView(viewList.get(position));
		
		
		return viewList.get(position);
	}
};

instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View

 

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
	// TODO Auto-generated method stub
	return arg0 == arg1;
}

isViewFromObject():对于这个函数就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。

 

下一篇,我将仔细讲解这几个函数的意义,与有关Key的知识,当然最后也会有个例子给大家。这篇就到这了。

 

源码地址:http://download.csdn.net/detail/harvic880925/7733249

 

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38453725  万分感激!!!!!

如果你喜欢我的文章,你可能更喜欢我的公众号

启舰杂谈

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163188.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决touchStart滑动时触发点击事件「建议收藏」

    解决touchStart滑动时触发点击事件「建议收藏」由于我们在将点击事件委托到div,span,font,p等元素标签上时会导致移动端的ios设备无法识别这个点击事件(一般指click事件),此时我们一般会使用touchstart来替换click事件,但是使用touchstart来代替click事件的弊端就立刻显示出来,每当我们滑动屏幕时就会立刻出发点击事件此时加入我这个封装的方法,这个弊端就会迎刃而解functiontap(el,fn…

    2022年6月19日
    24
  • pycharm配色方案下载_sublime修改字体大小

    pycharm配色方案下载_sublime修改字体大小话不多说,先看效果图python中设置配色基本流程都差不多,版本不一样,但是基本设置也是大同小异步骤如下:第一步:File→Settings→Appearance&Behavior→Theme:Darcula→OK第二步:File→Settings→Editor→ColorScheme→ColorSchemeFont→Sche…

    2022年8月27日
    0
  • SystemUI.apk等特殊APK文件的反编译和编译技巧[通俗易懂]

    SystemUI.apk等特殊APK文件的反编译和编译技巧[通俗易懂]SystemUI.apk等特殊APK文件的反编译和编译技巧   第一:要在你的PC上建立Java的环境,才能执行编译工作。具体方法我这个就不说了,你百度或者Google下就知道了,很简单的。   第二:下载必要的工具。Apktool工具。   下载后解压(有三个文件aapt.exe,apktool.bat,apktool.jar),为了方便。将解压出

    2022年9月18日
    0
  • 尚硅谷Oracle教程-学习笔记2

    尚硅谷Oracle教程-学习笔记2

    2022年3月8日
    408
  • docker部署web项目_小钢炮docker安装web

    docker部署web项目_小钢炮docker安装web前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年7月29日
    2
  • 博客日记目录[通俗易懂]

    博客日记目录[通俗易懂]用于整理博客,清晰记录发文过程2022年1月18日目录2022年1月2022年1月2022年1月20日【修改】Spring框架概述【补充】IOC操作Bean管理2022年1月19日【修改】Spring框架概述【补充】IOC操作Bean管理(xml)【修改】IDEA错误Nomainclassspecified【补充】新增视频版2022年1月18日【修改】Spring框架概述【补充】IOC操作Bean管理(xml)…

    2022年6月8日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号