ViewPager的多种应用详解(一)

今天整理了ViewPager的用法与实现,感觉有必要整理一下,供日后参看。

ViewPager,它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。类似于优酷客户端,手机软件首次引导等都可以用他来实现,总体来说应用主要分为两类,一种是手动的滑动实现页面的切换,图片的切换,另一种是实现图片自动滚动显示;

1.手动滑动的应用----软件首次使用引导模块;

创建项目viwepagerdemo1

首先我们先创建SplashActivity.java用于SharedPreferences的存储与记录,使用户初次进入软件出现引导模块,以后进入不在进入

package com.example.viewpagerdemo1;

import android.app.Activity;  
import android.content.Intent;  
import android.content.SharedPreferences;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
  
  
public class SplashActivity extends Activity {  
    boolean isFirstIn = false;  
  
    private static final int GO_HOME = 1000;  
    private static final int GO_GUIDE = 1001;  
    // 延迟3秒  
    private static final long SPLASH_DELAY_MILLIS = 3000;  
  
    private static final String SHAREDPREFERENCES_NAME = "first_pref";  
  
    /** 
     * Handler:跳转到不同界面 
     */  
    private Handler mHandler = new Handler() {  
  
        @Override  
        public void handleMessage(Message msg) {  
            switch (msg.what) {  
            case GO_HOME:  
                goHome();  
                break;  
            case GO_GUIDE:  
                goGuide();  
                break;  
            }  
            super.handleMessage(msg);  
        }  
    };  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.splash);  
  
        init();  
    }  
  
    private void init() {  
        // 读取SharedPreferences中需要的数据  
        // 使用SharedPreferences来记录程序的使用次数  
        SharedPreferences preferences = getSharedPreferences(  
                SHAREDPREFERENCES_NAME, MODE_PRIVATE);  
  
        // 取得相应的值,如果没有该值,说明还未写入,用true作为默认值  
        isFirstIn = preferences.getBoolean("isFirstIn", true);  
  
        // 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面  
        if (!isFirstIn) {  
            // 使用Handler的postDelayed方法,3秒后执行跳转到MainActivity  
            mHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);  
        } else {  
            mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);  
        }  
  
    }  
  
    private void goHome() {  
        Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
        SplashActivity.this.startActivity(intent);  
        SplashActivity.this.finish();  
    }  
  
    private void goGuide() {  
        Intent intent = new Intent(SplashActivity.this, GuideActivity.class);  
        SplashActivity.this.startActivity(intent);  
        SplashActivity.this.finish();  
    }  
}  

如果进入引导界面我们则需要创建GuideActivity.java

package com.example.viewpagerdemo1;

import java.util.ArrayList;  
import java.util.List;  
import android.app.Activity;  
import android.os.Bundle;  
import android.support.v4.view.ViewPager;  
import android.support.v4.view.ViewPager.OnPageChangeListener;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.widget.ImageView;  
import android.widget.LinearLayout;  
  
  
public class GuideActivity extends Activity implements OnPageChangeListener {  
  
    private ViewPager vp;  
    private ViewPagerAdapter vpAdapter;  
    private List<View> views;  
  
    // 底部小点图片  
    private ImageView[] dots;  
  
    // 记录当前选中位置  
    private int currentIndex;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.guide);  
  
        // 初始化页面  
        initViews();  
  
        // 初始化底部小点  
        initDots();  
    }  
  
    private void initViews() {  
        LayoutInflater inflater = LayoutInflater.from(this);  
  
        views = new ArrayList<View>();  
        // 初始化引导图片列表  
        views.add(inflater.inflate(R.layout.what_new_one, null));  
        views.add(inflater.inflate(R.layout.what_new_two, null));  
        views.add(inflater.inflate(R.layout.what_new_three, null));  
        views.add(inflater.inflate(R.layout.what_new_four, null));  
  
        // 初始化Adapter  
        vpAdapter = new ViewPagerAdapter(views, this);  
          
        vp = (ViewPager) findViewById(R.id.vPager);  
        vp.setAdapter(vpAdapter);  
        // 绑定回调  
        vp.setOnPageChangeListener(this);  
    }  
  
    private void initDots() {  
        LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
  
        dots = new ImageView[views.size()];  
  
        // 循环取得小点图片  
        for (int i = 0; i < views.size(); i++) {  
            dots[i] = (ImageView) ll.getChildAt(i);  
            dots[i].setEnabled(true);// 都设为灰色  
        }  
  
        currentIndex = 0;  
        dots[currentIndex].setEnabled(false);// 设置为白色,即选中状态  
    }  
  
    private void setCurrentDot(int position) {  
        if (position < 0 || position > views.size() - 1  
                || currentIndex == position) {  
            return;  
        }  
  
        dots[position].setEnabled(false);  
        dots[currentIndex].setEnabled(true);  
  
        currentIndex = position;  
    }  
  
    // 当滑动状态改变时调用  
    @Override  
    public void onPageScrollStateChanged(int arg0) {  
    }  
  
    // 当当前页面被滑动时调用  
    @Override  
    public void onPageScrolled(int arg0, float arg1, int arg2) {  
    }  
  
    // 当新的页面被选中时调用  
    @Override  
    public void onPageSelected(int arg0) {  
        // 设置底部小点选中状态  
        setCurrentDot(arg0);  
    }  
  
}  
在以上代码中我们用到了viewpager控件,因此需要写出viewpager的适配器ViewPagerAdapter,他是继承于PagerAdapter

package com.example.viewpagerdemo1;

import java.util.List;  
import android.app.Activity;  
import android.content.Context;  
import android.content.Intent;  
import android.content.SharedPreferences;  
import android.content.SharedPreferences.Editor;  
import android.os.Parcelable;  
import android.support.v4.view.PagerAdapter;  
import android.support.v4.view.ViewPager;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.ImageView;  
 
  
/** 
 */  
public class ViewPagerAdapter extends PagerAdapter {  
  
    // 界面列表  
    private List<View> views;  
    private Activity activity;  
    private static final String SHAREDPREFERENCES_NAME = "first_pref";  
    public ViewPagerAdapter(List<View> views, Activity activity) {  
        this.views = views;  
        this.activity = activity;  
    }  
  
    // 销毁arg1位置的界面  
    @Override  
    public void destroyItem(View arg0, int arg1, Object arg2) {  
        ((ViewPager) arg0).removeView(views.get(arg1));  
    }  
  
    @Override  
    public void finishUpdate(View arg0) {  
    }  
  
    // 获得当前界面数  
    @Override  
    public int getCount() {  
        if (views != null) {  
            return views.size();  
        }  
        return 0;  
    }  
  
    // 初始化arg1位置的界面  
    @Override  
    public Object instantiateItem(View arg0, int arg1) {  
        ((ViewPager) arg0).addView(views.get(arg1), 0);  
        if (arg1 == views.size() - 1) {  
            ImageView mStartWeiboImageButton = (ImageView) arg0  
                    .findViewById(R.id.iv_start_weibo);  
            mStartWeiboImageButton.setOnClickListener(new OnClickListener() {  
  
                @Override  
                public void onClick(View v) {  
                    // 设置已经引导  
                    setGuided();  
                    goHome();  
  
                }  
  
            });  
        }  
        return views.get(arg1);  
    }  
  
    private void goHome() {  
        // 跳转  
        Intent intent = new Intent(activity, MainActivity.class);  
        activity.startActivity(intent);  
        activity.finish();  
    }  
    /** 
     *  
     * method desc:设置已经引导过了,下次启动不用再次引导 
     */  
    private void setGuided() {  
        SharedPreferences preferences = activity.getSharedPreferences(  
                SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);  
        Editor editor = preferences.edit();  
        // 存入数据  
        editor.putBoolean("isFirstIn", false);  
        // 提交修改  
        editor.commit();  
    }  
  
    // 判断是否由对象生成界面  
    @Override  
    public boolean isViewFromObject(View arg0, Object arg1) {  
        return (arg0 == arg1);  
    }  
  
    @Override  
    public void restoreState(Parcelable arg0, ClassLoader arg1) {  
    }  
  
    @Override  
    public Parcelable saveState() {  
        return null;  
    }  
  
    @Override  
    public void startUpdate(View arg0) {  
    }  
  
}  

这也将是我们主要的分析片段,在以上代码中,我们可以看到有以下几次重要方法getCount,instantiateItem,destroyItem;

综观以上代码我们可以看出控制viewpager的核心部分有两部分,viewpagerdadpter和继承与OnPageChangeListener的监听,前者主要就是上面的三个方法,功能分别是得到viewpager的界面数;对position处的界面进行初始化;销毁position处的页面。后者主要实现的三个方法:onPageScrollStateChanged,onPageScrolled,onPageSelected。

其中onPageScrollStateChanged(int arg0)中arg0有0,1,2三种状态,arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。

onPageScrolled(int arg0,float arg1,int arg2)    ,当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法会一直得到调用。其中三个参数的含义分别为:

arg0 :当前页面,及你点击滑动的页面

arg1:当前页面偏移的百分比

arg2:当前页面偏移的像素位置   

onPageSelected(int arg0)中 ,  此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号)。

精益求精方可融会贯通!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值