zoukankan      html  css  js  c++  java
  • android:ViewPager实现Tabs滑动切换效果

    进入ViewPager官方文档

    public class

    ViewPager

    extends ViewGroup
    java.lang.Object
       ↳ android.view.View
         ↳ android.view.ViewGroup
           ↳ android.support.v4.view.ViewPager

    ViewPager是google SDk中附加包的一个类,可以用来实现屏幕间的切换,类似于Action Bar。

    从上面可以看出是android-support-v4.jar包

    效果如下:

    具体的一个很好的应用就是新浪博客客户端:

    下面我们就来做一个这种效果

    准备工作:从网上找android-support-v4.jar并导入到工程。(Properties -> java build path -> Libraries -> add XXX)

    第一步 xml界面定义 

    main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:umadsdk="http://schemas.android.com/apk/res/com.LoveBus"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="40.0dip"
            android:background="#FFFFFF" >
    
            <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="\@我"
                android:textColor="#000000"
                android:textSize="18.0dip" />
    
            <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="评论"
                android:textColor="#000000"
                android:textSize="18.0dip" />
    
            <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="私信"
                android:textColor="#000000"
                android:textSize="18.0dip" />
        </LinearLayout>
    
        <ImageView
            android:id="@+id/cursor"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scaleType="matrix"
            android:background="#FFFFFF"
            android:src="@drawable/a" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/vPager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1.0"
            android:background="#000000"
            android:flipInterval="30"
            android:persistentDrawingCache="animation" />
    
    </LinearLayout>
    

    comment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#d3d7d4"
        android:orientation="vertical" >
    
    
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="comment"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </LinearLayout>
    

     message.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#d3d7d4"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="message"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    
    </LinearLayout>
    

    reference.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#d3d7d4"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="\@me"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </LinearLayout>
    

     接下来就是写对应的activity

    MainActivity.java

    public class MessageHomeActivity extends Activity{
    	// ViewPager是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
    	// android-support-v4.jar
    	private ViewPager mPager;//页卡内容
    	private List<View> listViews; // Tab页面列表
    	private ImageView cursor;// 动画图片
    	private TextView t1, t2, t3;// 页卡头标
    	private int offset = 0;// 动画图片偏移量
    	private int currIndex = 0;// 当前页卡编号
    	private int bmpW;// 动画图片宽度
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		InitImageView();
    		InitTextView();
    		InitViewPager();
    	}
    
    	/**
    	 * 初始化头标
    	 */
    	private void InitTextView() {
    		t1 = (TextView) findViewById(R.id.text1);
    		t2 = (TextView) findViewById(R.id.text2);
    		t3 = (TextView) findViewById(R.id.text3);
    
    		t1.setOnClickListener(new MyOnClickListener(0));
    		t2.setOnClickListener(new MyOnClickListener(1));
    		t3.setOnClickListener(new MyOnClickListener(2));
    	}
    
    	/**
    	 * 初始化ViewPager
    	 */
    	private void InitViewPager() {
    		mPager = (ViewPager) findViewById(R.id.vPager);
    		listViews = new ArrayList<View>();
    		LayoutInflater mInflater = getLayoutInflater();
    		listViews.add(mInflater.inflate(R.layout.reference, null));
    		listViews.add(mInflater.inflate(R.layout.comment, null));
    		listViews.add(mInflater.inflate(R.layout.message, null));
    		mPager.setAdapter(new MyPagerAdapter(listViews));
    		mPager.setCurrentItem(0);
    		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
    	}
    
    	/**
    	 * 初始化动画
    	 */
    	private void InitImageView() {
    		cursor = (ImageView) findViewById(R.id.cursor);
    		bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
    				.getWidth();// 获取图片宽度
    		DisplayMetrics dm = new DisplayMetrics();
    		getWindowManager().getDefaultDisplay().getMetrics(dm);
    		int screenW = dm.widthPixels;// 获取分辨率宽度
    		offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
    		Matrix matrix = new Matrix();
    		matrix.postTranslate(offset, 0);
    		cursor.setImageMatrix(matrix);// 设置动画初始位置
    	}
    
    	/**
    	 * ViewPager适配器
    	 */
    	public class MyPagerAdapter extends PagerAdapter {
    		public List<View> mListViews;
    
    		public MyPagerAdapter(List<View> mListViews) {
    			this.mListViews = mListViews;
    		}
    
    		@Override
    		public void destroyItem(View arg0, int arg1, Object arg2) {
    			((ViewPager) arg0).removeView(mListViews.get(arg1));
    		}
    
    		@Override
    		public void finishUpdate(View arg0) {
    		}
    
    		@Override
    		public int getCount() {
    			return mListViews.size();
    		}
    
    		@Override
    		public Object instantiateItem(View arg0, int arg1) {
    			((ViewPager) arg0).addView(mListViews.get(arg1), 0);
    			return mListViews.get(arg1);
    		}
    
    		@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) {
    		}
    	}
    
    	/**
    	 * 头标点击监听
    	 */
    	public class MyOnClickListener implements View.OnClickListener {
    		private int index = 0;
    
    		public MyOnClickListener(int i) {
    			index = i;
    		}
    
    		@Override
    		public void onClick(View v) {
    			mPager.setCurrentItem(index);
    		}
    	};
    
    	/**
    	 * 页卡切换监听
    	 */
    	public class MyOnPageChangeListener implements OnPageChangeListener {
    
    		int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
    		int two = one * 2;// 页卡1 -> 页卡3 偏移量
    
    		@Override
    		public void onPageSelected(int arg0) {
    			Animation animation = null;
    			switch (arg0) {
    			case 0:
    				if (currIndex == 1) {
    					animation = new TranslateAnimation(one, 0, 0, 0);
    				} else if (currIndex == 2) {
    					animation = new TranslateAnimation(two, 0, 0, 0);
    				}
    				break;
    			case 1:
    				if (currIndex == 0) {
    					animation = new TranslateAnimation(offset, one, 0, 0);
    				} else if (currIndex == 2) {
    					animation = new TranslateAnimation(two, one, 0, 0);
    				}
    				break;
    			case 2:
    				if (currIndex == 0) {
    					animation = new TranslateAnimation(offset, two, 0, 0);
    				} else if (currIndex == 1) {
    					animation = new TranslateAnimation(one, two, 0, 0);
    				}
    				break;
    			}
    			currIndex = arg0;
    			animation.setFillAfter(true);// True:图片停在动画结束位置
    			animation.setDuration(300);
    			cursor.startAnimation(animation);
    		}
    
    		@Override
    		public void onPageScrolled(int arg0, float arg1, int arg2) {
    		}
    
    		@Override
    		public void onPageScrollStateChanged(int arg0) {
    		}
    	}
    }
    

     

    资源:

    效果图:

    参考:http://developer.android.com/reference/android/support/v4/view/ViewPager.html

            http://lib.open-open.com/view/1330341188375

    来源:http://www.cnblogs.com/dwinter/archive/2012/02/27/2369590.html

  • 相关阅读:
    5个有趣且不必要的 JavaScipt 技巧
    动态规划的原理?
    如何避免出现failfast?
    动态规划的原理?
    jsp文件导包
    程序突击
    monthly report
    weekly review: 细节决定一切
    weekly review
    祸从口入祸从口出
  • 原文地址:https://www.cnblogs.com/skiz/p/2733931.html
Copyright © 2011-2022 走看看