ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view,这个控件可用跟fragment使用,Fragment 这个下次会单独讲到用法,ViewPager类需要一个PagerAdapter适配器类给它提供数据。跟listview一样 需要适配器来填充数据。

     我们先来看看主界面的xml

<LinearLayout 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"
    android:background="#FFBA55"
    android:orientation="vertical"
    tools:context=".MainActivity" >
  
    <android.support.v4.view.ViewPager
        android:id="@+id/pageview"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:flipInterval="30"
        android:persistentDrawingCache="animation" >
    </android.support.v4.view.ViewPager>
    <ImageView 
         android:id="@+id/imagevie"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:scaleType="matrix"
         android:src="@drawable/line"
         />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/tv1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="C语言"
            android:textAlignment="center" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="JAVA语言"
            android:textAlignment="center" />

        <TextView
            android:id="@+id/tv3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="C#语言"
            android:textAlignment="center" />
    </LinearLayout>

</LinearLayout>

xml比较简单,底部为3个TextView后面可用点击切换ViewPager 在上面为一个游标一样  根据选择的页数 来进行移动,这个等下代码里会有 就是一些逻辑,其实也很简单。最上面则是ViewPager 。 

  注意:有的新手不懂android.support.v4.view.ViewPager 东西怎么打出来,其实就是一个空间 可用在Activity中 先申明一个ViewPager 然后鼠标悬停在 类上  就可以看到android.support.v4.view.ViewPager  。

            接下来看下适配器的工作原理:

package com.example.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.R.dimen;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

public class MyViewPageAdapter extends PagerAdapter
{
       private ArrayList<View> listviews=null;
       public MyViewPageAdapter()
	{
		// TODO 自动生成的构造函数存根
	}
	MyViewPageAdapter(ArrayList<View> listViews)
	{
		Log.w("INFOMATION", "1:构造函数");
		this.listviews=listViews;
	}
	@Override
	public int getCount()
	{
		// TODO 自动生成的方法存根
		Log.w("INFOMATION", "2:getCount()");
		return listviews.size();
	}
        @Override
	public boolean isViewFromObject(View arg0, Object arg1)
	{
		Log.w("INFOMATION", "isViewFromObject");
		// TODO 自动生成的方法存根
		return  arg0==arg1;
	}
	@Override
	public Object instantiateItem(ViewGroup container, int position)
	{
		Log.w("INFOMATION", "instantiateItem");
		container.addView(listviews.get(position));
		
		return listviews.get(position);
	}
  @Override
public void destroyItem(ViewGroup container, int position, Object object)
{
	  Log.w("INFOMATION", "destroyItem");
	// TODO 自动生成的方法存根
	 container.removeView(listviews.get(position));
}
}
    这些要实现的方法作用可用去 android developer 官网找到这个适配器 里面有详细的介绍。 

       其实适配器的工作原理 可用在方法里打个日志 我们可以在Log 里面清楚得看到 执行顺序。

   接下来看下 主Activity的代码:

package com.example.viewpager;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
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;

public class MainActivity extends Activity implements OnClickListener,OnPageChangeListener {


	private  ViewPager vPager_one;
	private TextView tv1,tv2,tv3;
	private ImageView imageView;
	private ArrayList<View> alist;
	//偏移量
	private int offset;
	//当前的PAGE的编号
	private int index; 
	private int bmpWidth;//图片宽度
	private int one=0;
	private int two=0;
	private MyViewPageAdapter mAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initControl();

		//获取图片的宽度
		bmpWidth=BitmapFactory.decodeResource(getResources(), R.drawable.line).getWidth();
		DisplayMetrics dMetrics=new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dMetrics);
		//获取屏幕分辨率
		int screen=dMetrics.widthPixels;
		//偏移量
		offset=(screen/3-bmpWidth)/2;
		one=offset*2+bmpWidth;
		two=one*2;
		Matrix matrix=new Matrix();
		matrix.postTranslate(offset, 0);
		imageView.setImageMatrix(matrix);

		//viewpager里面要显示的布局
		LayoutInflater li=getLayoutInflater();
		alist.add(li.inflate(R.layout.item_one, null));
		alist.add(li.inflate(R.layout.item_two, null));
		alist.add(li.inflate(R.layout.item_tree, null));
		mAdapter=new MyViewPageAdapter(alist);
		vPager_one.setAdapter(mAdapter);
		vPager_one.setCurrentItem(0);
    }
	private void initControl()
	{
		vPager_one=(ViewPager)findViewById(R.id.pageview);
		tv1=(TextView)findViewById(R.id.tv1);
		tv2=(TextView)findViewById(R.id.tv2);
		tv3=(TextView)findViewById(R.id.tv3);
		imageView=(ImageView)findViewById(R.id.imagevie);
		alist=new ArrayList<View>();
		tv1.setOnClickListener(this);
		tv2.setOnClickListener(this);
		tv3.setOnClickListener(this);
		vPager_one.setOnPageChangeListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	@Override
	public void onPageScrollStateChanged(int arg0)
	{
		// TODO 自动生成的方法存根

	}
	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2)
	{
		// TODO 自动生成的方法存根

	}
	@Override
	public void onPageSelected(int arg0)
	{
		Log.w("TAG", "onPageSelected");
		Animation animation=null;
		switch (arg0)
		{
			case 0 :
				if(index==1)
				{
					 animation=new TranslateAnimation(one,0,0,0);
				}
				else if (index==2)
				{
					animation=new TranslateAnimation(two, 0, 0, 0);
				}
				break;
			case 1 :
				if (index==0)
				{
					animation=new TranslateAnimation(offset, one, 0, 0);
					
				}
				else if (index==2)
				{
					animation=new TranslateAnimation(two, one, 0, 0);
					
				}
				break;
			case 2 :
				if (index==0)
				{
					animation=new TranslateAnimation(offset, two, 0, 0);
					
				}
				else if (index==1)
				{
					//------------------------------fromX toX
					animation=new TranslateAnimation(one, two, 0, 0);
				 }
				break;
 
		}
		  index=arg0;
		  animation.setFillAfter(true);
		  animation.setDuration(300);
		  imageView.startAnimation(animation);

	}
	@Override
	public void onClick(View v)
	{
		switch (v.getId())
		{
			case R.id.tv1 :
				vPager_one.setCurrentItem(0);

				break;
			case R.id.tv2 :
				vPager_one.setCurrentItem(1);

				break;
			case R.id.tv3 :
				vPager_one.setCurrentItem(2);

				break;
              }
              }
             }

     首先对一些控件进行初始化。最重要的一步 当滑动ViewPager的时候 那个imageView 图片进行移动  这个imageView在xml一定要设置android:scaleType="matrix"

        其实对图片的偏移量是很好计算的

offset=(screen/3-bmpWidth)/2;
       one=offset*2+bmpWidth;
       two=one*2;

       读者可用在画图上 画出一个模拟手机 然后对一些偏移量进行计算  进行计算  这个就跟以前数学的几何一样咯。

      底部imageview点击事件更改ViewPager的当前索引 这个也是很简单的;

          在onPageSelected  方法中  我们判断上一次的索引和当前索引的变化  然后对那个游标图片进行  动画处理  动画其实也是平移 TranslateAnimation类

          就是动画平移类,有兴趣可用取看下更多动画效果。

  

       大概ViewPager介绍到这里 ,因为用了很久博客 一直都在学习,这个第一篇博客,写的不太好,不过自己会加油的!


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐