ViewPager 滑动页面 很详细的注释

效果图:


项目结构: 

很简单 一个Activity 一个adapter 4个xml(一个为activity的布局,另外三个为viewpager的三个页面)


代码:

MainActivity  代码

/**
 * Copyright (C) 2014 The CSDN BLOG Project (TestViewPager)
 *
 * @author small_coder
 * 
 * 
 * 转载请保留此处  注明出处  谢谢合作!
 * 
 * 鄙人新手, 写博客只为巩固知识,文中不正之处,请各位前辈指出,谢谢!  
 * 
 * 
 */


package hhy.demo.csdn.activity;


import java.util.ArrayList;
import java.util.List;
import hhy.demo.csdn.R;
import hhy.demo.csdn.adapter.ViewPagerAdapter;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import android.app.Activity;


public class MainActivity extends Activity implements OnPageChangeListener {


/** ViewPager控件 */
private ViewPager mViewPager;


/** TAB选项卡下面的蓝色游标 */
private ImageView cursor;


/** 目前viewpager所在的页面 默认在第一个页面 */
private int current = 0;


/** 屏幕宽度 */
private int SCREEN_WIDTH;


/** 顶部的三个按钮 */
private TextView txt1;
private TextView txt2;
private TextView txt3;


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


initView();
}


/**
* 初始化界面
*/
private void initView() {

//顶部三个TAB 的监听

txt1 = (TextView) findViewById(R.id.text1);
txt2 = (TextView) findViewById(R.id.text2);
txt3 = (TextView) findViewById(R.id.text3);


txt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(0); //点击第一个,ViewPager 滑动到第一页
}
});
txt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(1); //点击第二个,ViewPager 滑动到第二页
}
});
txt3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(2);  //点击第三个,ViewPager 滑动到第三页
}
});

SCREEN_WIDTH = getScreenWidth(this);//获得屏幕宽度

cursor = (ImageView) findViewById(R.id.blue_cursor);//游标,就是三个TAB底部的蓝色长条

List<View> views = new ArrayList<View>(); //new一个集合将三个页面都add进去
// 分别得到三个页面的引用,当页面有控件的时候,需要用该view.findViewById找到
// 例如,我要得到tab1的textView 需要 TextView txt1 =
// tab1.findViewById(R.id.textview);
// 千万不能漏了tab1,否则会报空指针异常 请新手在写的时候注意
View tab1 = LayoutInflater.from(this).inflate(R.layout.tab1, null);
View tab2 = LayoutInflater.from(this).inflate(R.layout.tab2, null);
View tab3 = LayoutInflater.from(this).inflate(R.layout.tab3, null);
views.add(tab1);
views.add(tab2);
views.add(tab3);


mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setAdapter(new ViewPagerAdapter(views));  //viewpager设置适配器  将三个界面都添加到viewpager里面


mViewPager.setOnPageChangeListener(this);  //viewpager设置滑动监听,在页面改变的时候触发
}


@Override
public void onPageScrollStateChanged(int arg0) {
}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}


// arg0 当前页面的值 第一页是0 第二页是1 依次类推
// 这个arg0的是滑动后的页面值
@Override
public void onPageSelected(int arg0) {
Animation animation = null;
if (arg0 == 0 && current == 1) { // 如果当前页(current)在第二页 并且要滑往第一页游标从屏幕的1/3处 滑动到0点
animation = new TranslateAnimation(SCREEN_WIDTH / 3, 0, 0, 0);
} else if (arg0 == 2 && current == 1) {// 如果当前页(current)在第二页 并且要滑往第三页 游标从屏幕的1/3处 滑动到屏幕的2/3处
animation = new TranslateAnimation(SCREEN_WIDTH / 3,SCREEN_WIDTH / 3 * 2, 0, 0);
} else if (arg0 == 0 && current == 2) {// 如果当前页(current)在第三页 并且要滑往第一页 游标从屏幕的2/3处 滑动到屏幕的0点
animation = new TranslateAnimation(SCREEN_WIDTH / 3 * 2, 0, 0, 0);
} else if (arg0 == 1 && current == 2) {// 如果当前页(current)在第三页 并且要滑往第二页 游标从屏幕的2/3处 滑动到屏幕的1/3处
animation = new TranslateAnimation(SCREEN_WIDTH / 3 * 2,SCREEN_WIDTH / 3, 0, 0);
} else if (arg0 == 1 && current == 0) {// 如果当前页(current)在第一页 并且要滑往第二页 游标从屏幕的0处 滑动到屏幕的1/3处
animation = new TranslateAnimation(0, SCREEN_WIDTH / 3, 0, 0);
} else if (arg0 == 2 && current == 0) {// 如果当前页(current)在第一页 并且要滑往第三页 游标从屏幕的0处 滑动到屏幕的2/3处
animation = new TranslateAnimation(0, SCREEN_WIDTH / 3 * 2, 0, 0);
}
animation.setFillAfter(true);// true:图片停在动画结束的位置
animation.setDuration(300);// 动画执行时间
cursor.startAnimation(animation);//开始执行动画
current = arg0;//将当前页值赋给current

/***
* TranslateAnimation(float fromXDelta, float toXDelta, float
* fromYDelta, float toYDelta)  float fromXDelta:这个参数表示动画开始的点离当前View
* X坐标上的差值;
* 
  *   float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
* 
  *   float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
* 
  *   float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
*/
}

/***
* 得到屏幕宽度   这个一般写在Utils类里面,这里就一个方法就不另外写了
* @param context 
* @return  屏幕宽度
*/
public static int getScreenWidth(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
}



ViewPagerAdapter  代码


/**
 * Copyright (C) 2014 The CSDN BLOG Project (TestViewPager)
 *
 * @author small_coder
 * 
 * 
 * 转载请保留此处  注明出处  谢谢合作
 * 
 * ViewPager 适配器  
 */
package hhy.demo.csdn.adapter;


import java.util.List;


import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;


public class ViewPagerAdapter extends PagerAdapter{

/**页面数据,即添加到viewpager中的三个页面*/
private List<View> mViews;

/**
* 通过构造方法,将三个页面传给适配器
* @param mViews  页面数据
*/
public ViewPagerAdapter(List<View> mViews) {
super();
this.mViews = mViews; //传递页面数据
}


@Override
public int getCount() {

//返回页面的个数
return mViews.size();
}




@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//删除页卡 
container.removeView(mViews.get(position));
}




@Override
public Object instantiateItem(View container, int position) {
//实例化页卡
((ViewPager) container).addView(mViews.get(position),0);

return mViews.get(position);
}




@Override
public boolean isViewFromObject(View arg0, Object arg1) {
//这个我也不知道什么意思  只知道这么判断是对的
/**
* 官方对这个方法是这么解释的:
* 知道的朋友可以告诉我下,感激不尽
* Determines whether a page View is associated with a specific
* key object as returned by instantiateItem(ViewGroup, int).
* This method is required for a PagerAdapter to function properly.
*/
return arg0 == arg1;
}


}



activity_main.xml 代码


<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" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="46.0dip"
        android:background="#F5f5f5" >


        <TextView
            android:id="@+id/text1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="TAB1"
            android:textColor="#000000"
            android:textSize="16sp" />


        <View
            android:layout_width="1dp"
            android:layout_height="fill_parent"
            android:layout_marginBottom="12dp"
            android:layout_marginTop="12dp"
            android:background="#e1e1e1" />


        <TextView
            android:id="@+id/text2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="TAB2"
            android:textColor="#000000"
            android:textSize="16sp" />


        <View
            android:layout_width="1dp"
            android:layout_height="fill_parent"
            android:layout_marginBottom="12dp"
            android:layout_marginTop="12dp"
            android:background="#e1e1e1" />


        <TextView
            android:id="@+id/text3"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="TAB3"
            android:textColor="#000000"
            android:textSize="16sp" />
    </LinearLayout>


    <ImageView
        android:id="@+id/blue_cursor"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/linearLayout1"
        android:contentDescription="@null"
        android:scaleType="matrix"
        android:src="@drawable/blue_bar_line" />


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


</RelativeLayout>



tab1、tab2、tab3的代码就不上了,都只放了一个textView


至此,这个demo结束了。其实有很多更好的实现,目前,我项目需求只是这么多,有好的实现,请指点,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值