ViewPager实现简单Tab切换效果

简介:          不做安卓好几天了,最近两天一直在按照设计图布web页面,头都大了。但是感觉自己布页面的水平还是可以滴,布完页面之后瞬间感觉自己萌哒哒的~嘿嘿,不过安卓好几天不做了,手都生了,今天被一个大哥叫过去调ViewPager的一个东西,搞半天没弄出来,╮(╯▽╰)╭,看来Tech support还要继续学习。


         不做安卓好几天了,最近两天一直在按照设计图布web页面,头都大了。但是感觉自己布页面的水平还是可以滴,布完页面之后瞬间感觉自己萌哒哒的~嘿嘿,不过安卓好几天不做了,手都生了,今天被一个大哥叫过去调ViewPager的一个东西,搞半天没弄出来,╮(╯▽╰)╭,看来Tech support还要继续学习。



        好啦,先看一个做简单的ViewPage滑动,之后,我会在后续的博客中不断改进,达到一个理想的,可复用的东西。


       首先是布局XML文件:

     

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

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

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/tabstrip"
            android:layout_width="wrap_content"
            android:layout_height="50dip"
            android:gravity="center" />
    </android.support.v4.view.ViewPager>

</RelativeLayout>


         大致是这个样子滴:


     



   

Activity代码:

(我都写到onCreate里面了,只是为了做例子,新手注意!!!最近发现我写的很多代码都被人copy来copy去,变得我见了都哭笑不得了)



package com.example.liuhuichao.projecttest;

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

/*
* 功能:ViewPager的Demo
* 作者:刘慧超
* 时间:2015年11月15日23:47:34
* */
public class MainActivity extends AppCompatActivity {

    ViewPager pager=null;

    /*此处我们使用PagerTabStrip(此控件是可交互控件)
    *   说明,1,PagerTabStrip在当前页面下面,会有一个下划线条来提示当前页面的Tab是哪个
    *       2,PagerTabStrip的Tab是可以点击的, 当用户点击某一个Tab的时候,当前页面会跳转到这个页面,
    *           而PaperTitleStrip则没有这个功能
    * */
    PagerTabStrip tabStrip=null;
    ArrayList<View> viewContainter=new ArrayList<View>();//tab对应的视图
    ArrayList<String> titleContainer=new ArrayList<String>();//tab的标题
    public String TAG="tag";//用于logcat的输出

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

        pager=(ViewPager)findViewById(R.id.viewpager);
        tabStrip=(PagerTabStrip)this.findViewById(R.id.tabstrip);
        /*标题行的样式设置*/
        tabStrip.setDrawFullUnderline(false);//取消tab下面的长横线
        tabStrip.setBackgroundColor(123);//设置tab的背景色
        tabStrip.setTabIndicatorColor(234);//设置当前tab页签下划线颜色
        tabStrip.setTextSpacing(200);

        /*
        *   1, LayoutInflater作用是将layout的xml布局文件实例化为View类对象。
        *   2,inflater.inflate(R.layout.main, null)与LayoutInflater.from(this).inflate(R.layout.tab1,null);作用一样
        * */
        View view1= LayoutInflater.from(this).inflate(R.layout.tab1,null);
        View view2=LayoutInflater.from(this).inflate(R.layout.tab2,null);
        View view3=LayoutInflater.from(this).inflate(R.layout.tab3,null);
        View view4=LayoutInflater.from(this).inflate(R.layout.tab4,null);

        //从ViewPager开始添加View
        viewContainter.add(view1);
        viewContainter.add(view2);
        viewContainter.add(view3);
        viewContainter.add(view4);

        //页签项
        titleContainer.add("讲师信息");
        titleContainer.add("讲师课程");
        titleContainer.add("讲师评价");
        titleContainer.add("讲师主页");

        pager.setAdapter(new PagerAdapter() {

            /*
            * viewpager中组件数量
            * */
            @Override
            public int getCount() {
                return viewContainter.size();
            }

            /*
            * 初始化item
            *   做了两件事,第一:将当前视图添加到container中,第二:返回当前View
            *
            *   这个函数的实现的功能是创建指定位置的页面视图。
            *   适配器有责任增加即将创建的View视图到这里给定的container中,
            *   这是为了确保在finishUpdate(viewGroup)返回时this is be done!

            返回值:返回一个代表新增视图页面的Object(Key),这里没必要非要返回视图本身,
                也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,
                只要你可以与你增加的View一一对应即可,比如position变量也可以做为Key
            * */
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                ((ViewPager) container).addView(viewContainter.get(position));
                return viewContainter.get(position);
            }

            /*滑动切换的时候销毁当前组件
            *   从当前container中删除指定位置(position)的View;
            * */
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                ((ViewPager) container).removeView(viewContainter.get(position));
            }

            /*
            * */
            @Override
            public int getItemPosition(Object object) {
                return super.getItemPosition(object);
            }

            /*为每个页面提供页面标题*/
            @Override
            public CharSequence getPageTitle(int position) {
                return titleContainer.get(position);
            }

            /*
            * 该函数用来判断instantiateItem(ViewGroup, int)
            *   函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
            *
            *返回值:如果对应的是同一个View,返回True,否则返回False。
            * */
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;  //官方提示这样写
            }
        });

        /**/
        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            /*
            * 这个方法会在屏幕滚动过程中不断被调用。
            有三个参数,第一个position,这个参数要特别注意一下。
            当用手指滑动时,如果手指按在页面上不动,position和当前页面index是一致的;
            如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,
            只有翻页成功的情况下最后一次调用才会变为目标页面;如果手指向右拖动(相应页面向左翻动),
            这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面。
            当直接设置setCurrentItem翻页时,
            如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面),
            如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面;
            如果向左翻动,position和目标页面是一致的。这和用手指拖动页面翻动是基本一致的。
            如果不是相邻的情况,比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,
            然后逐步变成2;我从第三个页面跳到第一个页面,position先是1,然后逐步变成0,
            并没有出现为2的情况。
            positionOffset是当前页面滑动比例,如果页面向右翻动,这个值不断变大,
            最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0。
            positionOffsetPixels是当前页面滑动像素,变化情况和positionOffset一致。
            * */

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                Log.d(TAG, "------scrolled positon:" + position);
                Log.d(TAG, "------scrolled positionOffset:" + positionOffset);
                Log.d(TAG, "------scrolled positionOffsetPixels:" + positionOffsetPixels);
            }

            /*
            *
            * 这个方法有一个参数position,代表哪个页面被选中。
            * 当用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),
            * 手指抬起来就会立即执行这个方法,position就是当前滑动到的页面。
            * 如果直接setCurrentItem翻页,那position就和setCurrentItem的参数一致,
            * 这种情况在onPageScrolled执行方法前就会立即执行。
            * */
            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "-----Selected:" + position);
            }



            /*
           * 这个方法在手指操作屏幕的时候发生变化。
           * 有三个值:0(END),1(PRESS) , 2(UP) 。
           当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1,
           手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0 。
           总共执行这个方法三次。一种特殊情况是手指按下去以后一点滑动也没有发生,
           这个时候只会调用这个方法两次,state值分别是1,0 。
           当setCurrentItem翻页时,会执行这个方法两次,state值分别为2 , 0
           * */
            @Override
            public void onPageScrollStateChanged(int state) {
                Log.d(TAG,"-----changed:"+state);
            }
        });

    }


}


      run完之后发现基本功能有了,剩下的还有一点儿小bug,在后续blog中,我们将对这个东西做一个改进。


     PS:不要指望一口吃成胖子,胖子是一口一口吃成的。偷笑









目录
相关文章
|
8月前
|
Android开发 UED 开发者
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突(二)
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突
|
8月前
|
Android开发
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突(一)
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突
|
XML Java 数据格式
ViewPager和Fragment使用(附源码)
1 初级版 ViewPager通过滑动来切换Fragment,无底部导航栏。 用法:数据List<Fragment>+适配器FragmentPagerAdapter+ViewPager 通过FragmentPagerAdapter连接两者的桥梁,里面需要重写两个方法getItem,getCount。 第一个方法是获取一个Fragment,从数据源获取。 第二个方法是获取数据源的大小,也就是有几页。
113 0
|
XML 数据格式
千变万化的ViewPager指示器-MagicIndicator
千变万化的ViewPager指示器-MagicIndicator
千变万化的ViewPager指示器-MagicIndicator
|
Java Android开发
ViewPager通过自定义适配器MyPagerAdapter实现界面导航(上标题)
ViewPager ViewPager的使用技巧其实有很多,这里只是我个人 平时学习得到的经验,希望对大家有所帮助,如有不对还请见谅。 很乐意接纳大家的意见与建议,本人邮箱: 893239524@qq.com
6678 0
|
Java Android开发 容器
TableLayout和Viewpager实现切换
因为我是在之前的基础上写的,所以这个TableLayout和Viewpager实际上是写在Fragment上的。要写到Activity里其实也是一样的啦。 先看效果图,原谅我不会动态图,只能截个图啦 布局文件 app:tabIndicatorcolor意思是选中的导航条的颜色。 app:tabSelectesTextColor是选中的导航条的文字
2175 0