ViewPager和TabHost结合

前几天看了网上关于ViewPager实现滑动切换的效果。回来试了一下,发现效果确实不错,但是切换的几个页面只是调用了不同的layout,实际上还是在一个Activity里面,对功能编写就不方便了。所以,我想到了TabHost和ViewPager结合,使用TabHost切换Activity,使用ViewPager切换界面,从而晚上切换效果。废话少说,直接看代码吧。
首先是布局的xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@android:id/tabhost"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent" >

  6.     <LinearLayout
  7.         android:id="@+id/linearLayout1"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent"
  10.         android:orientation="vertical" >

  11.         <TabWidget
  12.             android:id="@android:id/tabs"
  13.             android:layout_width="wrap_content"
  14.             android:layout_height="0dip" >
  15.         </TabWidget>

  16.         <LinearLayout
  17.         android:id="@+id/linearLayout1"
  18.         android:layout_width="fill_parent"
  19.         android:layout_height="40dip"
  20.         android:background="@drawable/title" >

  21.         <TextView
  22.             android:id="@+id/text1"
  23.             android:layout_width="fill_parent"
  24.             android:layout_height="fill_parent"
  25.             android:layout_weight="1.0"
  26.             android:gravity="center"
  27.             android:text="@string/black"
  28.             android:textColor="#FFFFFF"
  29.             android:textSize="22.0dip" />

  30.         <TextView
  31.             android:id="@+id/text2"
  32.             android:layout_width="fill_parent"
  33.             android:layout_height="fill_parent"
  34.             android:layout_weight="1.0"
  35.             android:gravity="center"
  36.             android:text="@string/gray"
  37.             android:textColor="#FFFFFF"
  38.             android:textSize="22.0dip" />

  39.         <TextView
  40.             android:id="@+id/text3"
  41.             android:layout_width="fill_parent"
  42.             android:layout_height="fill_parent"
  43.             android:layout_weight="1.0"
  44.             android:gravity="center"
  45.             android:text="@string/white"
  46.             android:textColor="#FFFFFF"
  47.             android:textSize="22.0dip" />
  48.     </LinearLayout>
  49.     
  50.     <ImageView
  51.         android:id="@+id/cursor"
  52.         android:layout_width="fill_parent"
  53.         android:layout_height="wrap_content"
  54.         android:scaleType="matrix"
  55.         android:src="@drawable/a" />

  56.     <android.support.v4.view.ViewPager
  57.         android:id="@+id/vPager"
  58.         android:layout_width="wrap_content"
  59.         android:layout_height="wrap_content"
  60.         android:layout_gravity="center"
  61.         android:layout_weight="1.0"
  62.         android:background="#000000"
  63.         android:flipInterval="30"
  64.         android:persistentDrawingCache="animation" />

  65.         <FrameLayout
  66.             android:id="@android:id/tabcontent"
  67.             android:layout_width="wrap_content"
  68.             android:layout_height="wrap_content"
  69.             android:visibility="gone" >
  70.         </FrameLayout>
  71.     </LinearLayout>

  72. </TabHost>
复制代码
然后是java文件
  1. package com.wcs233;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. import android.app.LocalActivityManager;
  5. import android.app.TabActivity;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.graphics.BitmapFactory;
  9. import android.graphics.Matrix;
  10. import android.os.Bundle;
  11. import android.os.Parcelable;
  12. import android.support.v4.view.PagerAdapter;
  13. import android.support.v4.view.ViewPager;
  14. import android.support.v4.view.ViewPager.OnPageChangeListener;
  15. import android.util.DisplayMetrics;
  16. import android.util.Log;
  17. import android.view.View;
  18. import android.view.Window;
  19. import android.view.animation.Animation;
  20. import android.view.animation.TranslateAnimation;
  21. import android.widget.ImageView;
  22. import android.widget.TabHost;
  23. import android.widget.TextView;

  24. public class ConfigTabActivity extends TabActivity {

  25.         //页卡内容
  26.         private ViewPager mPager;
  27.         // Tab页面列表
  28.         private List<View> listViews; 
  29.         // 动画图片
  30.         private ImageView cursor;
  31.         // 页卡头标
  32.         private TextView t1, t2, t3;
  33.         // 动画图片偏移量
  34.         private int offset = 0;
  35.         // 当前页卡编号
  36.         private int currIndex = 0;
  37.         // 动画图片宽度
  38.         private int bmpW;
  39.         private LocalActivityManager manager = null;
  40.         private final static String TAG = "ConfigTabActivity";
  41.         private final Context context = ConfigTabActivity.this;
  42.         private TabHost mTabHost;

  43.     /** Called when the activity is first created. */
  44.     @Override
  45.     public void onCreate(Bundle savedInstanceState) {
  46.         super.onCreate(savedInstanceState);
  47.         
  48.         Log.d(TAG, "---onCreate---");
  49.                 
  50.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  51.         setContentView(R.layout.config);
  52.         
  53.         mTabHost = getTabHost();  
  54.         mTabHost.addTab(mTabHost.newTabSpec("A").setIndicator(  
  55.                 "").setContent(  
  56.                 new Intent(this, A.class)));  
  57.         mTabHost.addTab(mTabHost.newTabSpec("B").setIndicator(  
  58.                 "").setContent(  
  59.                 new Intent(this, B.class))); 
  60.         mTabHost.addTab(mTabHost.newTabSpec("C").setIndicator(  
  61.                 "").setContent(  
  62.                 new Intent(this, C.class)));  
  63.         mTabHost.setCurrentTab(0);  
  64.         
  65.         manager = new LocalActivityManager(this, true);
  66.                 manager.dispatchCreate(savedInstanceState);
  67.         
  68.         InitImageView();
  69.                 InitTextView();
  70.                 InitViewPager();
  71.     }
  72.     
  73.     /**
  74.          * 初始化头标
  75.          */
  76.         private void InitTextView() {
  77.                 t1 = (TextView) findViewById(R.id.text1);
  78.                 t2 = (TextView) findViewById(R.id.text2);
  79.                 t3 = (TextView) findViewById(R.id.text3);

  80.                 t1.setOnClickListener(new MyOnClickListener(0));
  81.                 t2.setOnClickListener(new MyOnClickListener(1));
  82.                 t3.setOnClickListener(new MyOnClickListener(2));
  83.         }
  84.         
  85.         /**
  86.          * 初始化ViewPager
  87.          */
  88.         private void InitViewPager() {
  89.                 mPager = (ViewPager) findViewById(R.id.vPager);
  90.                 listViews = new ArrayList<View>();
  91.                 MyPagerAdapter mpAdapter = new MyPagerAdapter(listViews);
  92.                 Intent intent = new Intent(context, A.class);
  93.                 listViews.add(getView("Black", intent));
  94.                 Intent intent2 = new Intent(context, B.class);
  95.                 listViews.add(getView("Gray", intent2));
  96.                 Intent intent3 = new Intent(context, C.class);
  97.                 listViews.add(getView("White", intent3));
  98.                 mPager.setAdapter(mpAdapter);
  99.                 mPager.setCurrentItem(0);
  100.                 mPager.setOnPageChangeListener(new MyOnPageChangeListener());
  101.         }
  102.         
  103.         /**
  104.          * 初始化动画
  105.          */
  106.         private void InitImageView() {
  107.                 cursor = (ImageView) findViewById(R.id.cursor);
  108.                 bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
  109.                                 .getWidth();// 获取图片宽度
  110.                 DisplayMetrics dm = new DisplayMetrics();
  111.                 getWindowManager().getDefaultDisplay().getMetrics(dm);
  112.                 int screenW = dm.widthPixels;// 获取分辨率宽度
  113.                 offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
  114.                 Matrix matrix = new Matrix();
  115.                 matrix.postTranslate(offset, 0);
  116.                 cursor.setImageMatrix(matrix);// 设置动画初始位置
  117.         }
  118.         
  119.         /**
  120.          * ViewPager适配器
  121.          */
  122.         public class MyPagerAdapter extends PagerAdapter {
  123.                 public List<View> mListViews;

  124.                 public MyPagerAdapter(List<View> mListViews) {
  125.                         this.mListViews = mListViews;
  126.                 }

  127.                 @Override
  128.                 public void destroyItem(View arg0, int arg1, Object arg2) {
  129.                         ((ViewPager) arg0).removeView(mListViews.get(arg1));
  130.                 }

  131.                 @Override
  132.                 public void finishUpdate(View arg0) {
  133.                 }

  134.                 @Override
  135.                 public int getCount() {
  136.                         return mListViews.size();
  137.                 }

  138.                 @Override
  139.                 public Object instantiateItem(View arg0, int arg1) {
  140.                         ((ViewPager) arg0).addView(mListViews.get(arg1), 0);
  141.                         return mListViews.get(arg1);
  142.                 }

  143.                 @Override
  144.                 public boolean isViewFromObject(View arg0, Object arg1) {
  145.                         return arg0 == (arg1);
  146.                 }

  147.                 @Override
  148.                 public void restoreState(Parcelable arg0, ClassLoader arg1) {
  149.                 }

  150.                 @Override
  151.                 public Parcelable saveState() {
  152.                         return null;
  153.                 }

  154.                 @Override
  155.                 public void startUpdate(View arg0) {
  156.                 }
  157.         }

  158.         /**
  159.          * 头标点击监听
  160.          */
  161.         public class MyOnClickListener implements View.OnClickListener {
  162.                 private int index = 0;

  163.                 public MyOnClickListener(int i) {
  164.                         index = i;
  165.                 }

  166.                 @Override
  167.                 public void onClick(View v) {
  168.                         mPager.setCurrentItem(index);
  169.                 }
  170.         };

  171.         /**
  172.          * 页卡切换监听
  173.          */
  174.         public class MyOnPageChangeListener implements OnPageChangeListener {

  175.                 int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
  176.                 int two = one * 2;// 页卡1 -> 页卡3 偏移量

  177.                 @Override
  178.                 public void onPageSelected(int arg0) {
  179.                         Animation animation = null;
  180.                         Intent intent = new Intent();
  181.                         switch (arg0) {
  182.                         case 0:
  183.                                 
  184.                                 Log.d(TAG, "---0---");
  185.                                 mTabHost.setCurrentTab(0);  
  186.                                 if (currIndex == 1) {
  187.                                         animation = new TranslateAnimation(one, 0, 0, 0);
  188.                                 } else if (currIndex == 2) {
  189.                                         animation = new TranslateAnimation(two, 0, 0, 0);
  190.                                 }
  191.                                 break;
  192.                         case 1:
  193.                                 
  194.                                 Log.d(TAG, "---1---");
  195.                                 mTabHost.setCurrentTab(1);
  196.                                 if (currIndex == 0) {
  197.                                         animation = new TranslateAnimation(offset, one, 0, 0);
  198.                                 } else if (currIndex == 2) {
  199.                                         animation = new TranslateAnimation(two, one, 0, 0);
  200.                                 }
  201.                                 break;
  202.                         case 2:
  203.                                 
  204.                                 Log.d(TAG, "---2---");
  205.                                 mTabHost.setCurrentTab(2);
  206.                                 if (currIndex == 0) {
  207.                                         animation = new TranslateAnimation(offset, two, 0, 0);
  208.                                 } else if (currIndex == 1) {
  209.                                         animation = new TranslateAnimation(one, two, 0, 0);
  210.                                 }
  211.                                 break;
  212.                         }
  213.                         currIndex = arg0;
  214.                         animation.setFillAfter(true);// True:图片停在动画结束位置
  215.                         animation.setDuration(300);
  216.                         cursor.startAnimation(animation);
  217.                 }

  218.                 @Override
  219.                 public void onPageScrolled(int arg0, float arg1, int arg2) {
  220.                 }

  221.                 @Override
  222.                 public void onPageScrollStateChanged(int arg0) {
  223.                 }
  224.         }
  225.         
  226.         private View getView(String id,Intent intent)
  227.         {
  228.                 return manager.startActivity(id, intent).getDecorView();
  229.         }
  230. }
复制代码
至于每个单独页面的layout和java,大家就根据自己的需求写吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值