ViewPager 詳解


ViewPager 這是谷歌官方給我們提供的一個兼容低版本安卓設備的軟件包,裏面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我們可以做很多事情,從最簡單的導航,到頁面菜單等等。那如何使用它呢,與LisstView類似,我們也需要一個適配器,他就是PagerAdapter。

以下我們來做一個新浪微博的導航,是怎麼利用ViewPager來完成的。

首先,我們先創建一個新的項目名爲:ViewPagerDemo

創建一個新的Activity做爲導航界面。GuideActivity 的佈局文件如下:

備註:ViewPager是在V4包中的,所以必須從android.support.v4.view.ViewPager中獲取。

 <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        >
    </android.support.v4.view.ViewPager>

ViewPager與LisstView類似,我們也需要一個適配器,他就是PagerAdapter。先創建一個ViewPagerAdapter類繼承PagerAdapter.

ViewPagerAdapte類代碼:

package com.example.viewpagerdemo;

import java.util.List;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
/**
 * ViewPagerAdapter類
 * @author user11
 *
 */

public class ViewPagerAdapter extends PagerAdapter{
	
	//創建一個集合,存放所有的View
	private List<View> views;
	//創建一個Context,承接上下文
	private Context context;
	//創建一個構造方法,傳遞參數
	public ViewPagerAdapter(List<View> views,Context context) {
		this.views = views;
		this.context = context;
	}
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return views.size();
	}
	//添加View
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		container.addView(views.get(position));
		return views.get(position);
	}
	//銷燬View
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView(views.get(position));
	}
	
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg0 == arg1;
	}

}


創建好ViewPagerAdapter類,就可以在GuideActivity中引用了。

先定義三個對象:

<pre name="code" class="html">//ViewPager對象
private ViewPager vp;
//ViewPager對象的適配器
private ViewPagerAdapter vpAdapter;
//存放View集合
private List<View> views;

實例化對象:
/**
	 * 初始化控件
	 */
	private void initWidget() {
		vp = (ViewPager) findViewById(R.id.view_pager);
		views = new ArrayList<View>();
	}

接下來就可以將導航的界面添加到ViewPager中。動態生成View

/**
	 * 動態加載View
	 */
	private void initView() {
		LayoutInflater inflater = LayoutInflater.from(this);
		// 加載View
		views.add(inflater.inflate(R.layout.guide_one, null));
		views.add(inflater.inflate(R.layout.guide_two, null));
		views.add(inflater.inflate(R.layout.guide_three, null));
<span style="white-space:pre">		</span>//將views集合傳遞到適配器中
		vpAdapter = new ViewPagerAdapter(views, this);
<span style="white-space:pre">		</span>//配置ViewPager的適配器
		vp.setAdapter(vpAdapter);
<span style="white-space:pre">	</span>}

添加到View的佈局文件,根據自己的項目需求,可自定義佈局文件。這邊只是簡單的設置一個ImageView文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
	<ImageView 
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:scaleType="center"
	    android:src="@drawable/guide_1"
	    />
</RelativeLayout>

這樣就可以實現ViewPager的左右滑動了。爲了更好的導航,在圖片的下方,有些小點,來提示用戶當前是第幾張圖片。那麼這是如何做到的呢?

其實很簡單。請大家耐心的讀下去。

首先設置ViewPager的佈局文件如下:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        >
    </android.support.v4.view.ViewPager>
    
    <LinearLayout 
        android:id="@+id/linear_layout_dot"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center_horizontal"
        >
        <ImageView 
            android:id="@+id/dot1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="16dp"
            android:src="@drawable/login_point_selected"
            />
        <ImageView 
            android:id="@+id/dot2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/login_point"
            />
        <ImageView 
            android:id="@+id/dot3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:src="@drawable/login_point"
            />
    </LinearLayout>
</RelativeLayout>

和之前的相比較,底下多了三個ImageView,用來存放提示點。

那麼如何控制,當滑動圖片的時候,只有當前頁下方的點是亮的,其餘點是不亮的呢。首先我們必須獲取點的id,來改變ImageView的圖片資源。

創建點的圖片集合和點的id集合 對象

private ImageView[] dots;
private Integer[] ids = { R.id.dot1, R.id.dot2, R.id.dot3 };

利用一個for循環來獲取點的id

/**
	 * 對點的操作方法
	 */
	private void initDots() {
		dots = new ImageView[views.size()];
		// 通過for循環獲取點的id
		for (int i = 0; i < views.size(); i++) {
			dots[i] = (ImageView) findViewById(ids[i]);
		}
	}
獲取到點的圖像集合,就可以設置ViewPager的監聽事件,當前頁面被選中的時候,相應的點就亮起來,其餘的點不亮

**
	 * ViewPager的監聽事件
	 */
	// 滑動狀態改變的時候調用
	@Override
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub

	}

	// 頁面被滑動時調用
	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		// TODO Auto-generated method stub

	}

	// 當前新的頁面被選中的時候調用
	@Override
	public void onPageSelected(int position) {
		for (int i = 0; i < ids.length; i++) {
			if (i == position) {
				dots[i].setImageResource(R.drawable.login_point_selected);
			} else {
				dots[i].setImageResource(R.drawable.login_point);
			}
		}

	}

這樣,左右滑動的時候,底下的亮就會跟着一起變。

那麼導航界面,一般只有在第一次啓動程序的時候,纔會跳轉到導航界面。第二次在啓動程序,就直接跳轉到主界面了。那麼如何實現呢?

大家一起來學習下吧!

創建一個歡迎界面,啓動程序,一般都有個歡迎界面,從歡迎界面中判斷是跳轉到導航界面還是主界面。

package com.example.viewpagerdemo;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;

public class Welcome extends Activity{
	private boolean isFirstIn = false;
	private static final int TIME = 2000;
	private static final int GO_HOME = 1000;
	private static final int GO_GUIDE = 1001;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.welcome);
		init();
	}
	//只有第一次安裝程序進入導航界面 ,否則進入主界面
	private void init(){
		SharedPreferences preferences = getSharedPreferences("imcore", MODE_PRIVATE);
		isFirstIn = preferences.getBoolean("isFirstIn", true);
		if(!isFirstIn){
			mHandler.sendEmptyMessageDelayed(GO_HOME, TIME);
		}else{
			mHandler.sendEmptyMessageDelayed(GO_GUIDE, TIME);
			//修改isFirstIn爲false
			Editor editor = preferences.edit();
			editor.putBoolean("isFirstIn", false);
			editor.commit();
		}
	}
	
	private Handler mHandler = new Handler(){
		 public void handleMessage(android.os.Message msg) {
			 switch (msg.what) {
			case GO_HOME:
				//
				goHome();
				break;
			case GO_GUIDE:
				//
				goGuide();
				break;
			}
		 };
	};
	//進入主界面
	private void goHome(){
		Intent intent = new Intent(Welcome.this,MainActivity.class);
		startActivity(intent);
	}
	//進入引導界面
	private void goGuide(){
		Intent intent = new Intent(Welcome.this,GuideActivity.class);
		startActivity(intent);
	}
}
有什麼問題的,歡迎大家留言。一起學習吧。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章