前几天看了网上关于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"
3android:id="@android:id/tabhost"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent" >
6
7<LinearLayout
8 android:id="@+id/linearLayout1"
9android:layout_width="fill_parent"
10android:layout_height="fill_parent"
11android:orientation="vertical" >
12
13<TabWidget
14 android:id="@android:id/tabs"
15android:layout_width="wrap_content"
16android:layout_height="0dip" >
17</TabWidget>
18
19<LinearLayout
20 android:id="@+id/linearLayout1"
21android:layout_width="fill_parent"
22android:layout_height="40dip"
23android:background="@drawable/title" >
24
25<TextView
26 android:id="@+id/text1"
27android:layout_width="fill_parent"
28android:layout_height="fill_parent"
29android:layout_weight="1.0"
30android:gravity="center"
31android:text="@string/black"
32android:textColor="#FFFFFF"
33android:textSize="22.0dip" />
34
35<TextView
36 android:id="@+id/text2"
37android:layout_width="fill_parent"
38android:layout_height="fill_parent"
39android:layout_weight="1.0"
40android:gravity="center"
41android:text="@string/gray"
42android:textColor="#FFFFFF"
43android:textSize="22.0dip" />
44
45<TextView
46 android:id="@+id/text3"
47android:layout_width="fill_parent"
48android:layout_height="fill_parent"
49android:layout_weight="1.0"
50android:gravity="center"
51android:text="@string/white"
52android:textColor="#FFFFFF"
53android:textSize="22.0dip" />
54</LinearLayout>
55
56<ImageView
57 android:id="@+id/cursor"
58android:layout_width="fill_parent"
59android:layout_height="wrap_content"
60android:scaleType="matrix"
61android:src="@drawable/a" />
62
63<android.support.v4.view.ViewPager
64 android:id="@+id/vPager"
65android:layout_width="wrap_content"
66android:layout_height="wrap_content"
67android:layout_gravity="center"
68android:layout_weight="1.0"
69android:background="#000000"
70android:flipInterval="30"
71android:persistentDrawingCache="animation" />
72
73<FrameLayout
74 android:id="@android:id/tabcontent"
75android:layout_width="wrap_content"
76android:layout_height="wrap_content"
77android:visibility="gone" >
78</FrameLayout>
79</LinearLayout>
80
81 </TabHost>
然后是java文件
1 package com.wcs233;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import android.app.LocalActivityManager;
7 import android.app.TabActivity;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.graphics.BitmapFactory;
11 import android.graphics.Matrix;
12 import android.os.Bundle;
13 import android.os.Parcelable;
14 import android.support.v4.view.PagerAdapter;
15 import android.support.v4.view.ViewPager;
16 import android.support.v4.view.ViewPager.OnPageChangeListener;
17 import android.util.DisplayMetrics;
18 import android.util.Log;
19 import android.view.View;
20 import android.view.Window;
21 import android.view.animation.Animation;
22 import android.view.animation.TranslateAnimation;
23 import android.widget.ImageView;
24 import android.widget.TabHost;
25 import android.widget.TextView;
26
27 public class ConfigTabActivity extends TabActivity {
28
29//页卡内容
30private ViewPager mPager;
31// Tab页面列表
32private List<View> listViews;
33// 动画图片
34private ImageView cursor;
35// 页卡头标
36private TextView t1, t2, t3;
37// 动画图片偏移量
38private int offset = 0;
39// 当前页卡编号
40private int currIndex = 0;
41// 动画图片宽度
42private int bmpW;
43private LocalActivityManager manager = null;
44private final static String TAG = "ConfigTabActivity";
45private final Context context = ConfigTabActivity.this;
46private TabHost mTabHost;
47
48/** Called when the activity is first created. */
49@Override
50public void onCreate(Bundle savedInstanceState) {
51super.onCreate(savedInstanceState);
52
53Log.d(TAG, "---onCreate---");
54
55requestWindowFeature(Window.FEATURE_NO_TITLE);
56setContentView(R.layout.config);
57
58mTabHost = getTabHost();
59mTabHost.addTab(mTabHost.newTabSpec("A").setIndicator(
60"").setContent(
61new Intent(this, A.class)));
62mTabHost.addTab(mTabHost.newTabSpec("B").setIndicator(
63"").setContent(
64new Intent(this, B.class)));
65mTabHost.addTab(mTabHost.newTabSpec("C").setIndicator(
66"").setContent(
67new Intent(this, C.class)));
68mTabHost.setCurrentTab(0);
69
70manager = new LocalActivityManager(this, true);
71manager.dispatchCreate(savedInstanceState);
72
73InitImageView();
74InitTextView();
75InitViewPager();
76}
77
78/**
79* 初始化头标
80 */
81private void InitTextView() {
82t1 = (TextView) findViewById(R.id.text1);
83t2 = (TextView) findViewById(R.id.text2);
84t3 = (TextView) findViewById(R.id.text3);
85
86t1.setOnClickListener(new MyOnClickListener(0));
87t2.setOnClickListener(new MyOnClickListener(1));
88t3.setOnClickListener(new MyOnClickListener(2));
89}
90
91/**
92* 初始化ViewPager
93 */
94private void InitViewPager() {
95mPager = (ViewPager) findViewById(R.id.vPager);
96listViews = new ArrayList<View>();
97MyPagerAdapter mpAdapter = new MyPagerAdapter(listViews);
98Intent intent = new Intent(context, A.class);
99listViews.add(getView("Black", intent));
100Intent intent2 = new Intent(context, B.class);
101listViews.add(getView("Gray", intent2));
102Intent intent3 = new Intent(context, C.class);
103listViews.add(getView("White", intent3));
104mPager.setAdapter(mpAdapter);
105mPager.setCurrentItem(0);
106mPager.setOnPageChangeListener(new MyOnPageChangeListener());
107}
108
109/**
110* 初始化动画
111 */
112private void InitImageView() {
113cursor = (ImageView) findViewById(R.id.cursor);
114bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
115.getWidth();// 获取图片宽度
116DisplayMetrics dm = new DisplayMetrics();
117getWindowManager().getDefaultDisplay().getMetrics(dm);
118int screenW = dm.widthPixels;// 获取分辨率宽度
119offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
120Matrix matrix = new Matrix();
121matrix.postTranslate(offset, 0);
122cursor.setImageMatrix(matrix);// 设置动画初始位置
123}
124
125/**
126* ViewPager适配器
127 */
128public class MyPagerAdapter extends PagerAdapter {
129public List<View> mListViews;
130
131public MyPagerAdapter(List<View> mListViews) {
132this.mListViews = mListViews;
133}
134
135@Override
136public void destroyItem(View arg0, int arg1, Object arg2) {
137((ViewPager) arg0).removeView(mListViews.get(arg1));
138}
139
140@Override
141public void finishUpdate(View arg0) {
142}
143
144@Override
145public int getCount() {
146return mListViews.size();
147}
148
149@Override
150public Object instantiateItem(View arg0, int arg1) {
151((ViewPager) arg0).addView(mListViews.get(arg1), 0);
152return mListViews.get(arg1);
153}
154
155@Override
156public boolean isViewFromObject(View arg0, Object arg1) {
157return arg0 == (arg1);
158}
159
160@Override
161public void restoreState(Parcelable arg0, ClassLoader arg1) {
162}
163
164@Override
165public Parcelable saveState() {
166return null;
167}
168
169@Override
170public void startUpdate(View arg0) {
171}
172}
173
174/**
175* 头标点击监听
176 */
177public class MyOnClickListener implements View.OnClickListener {
178private int index = 0;
179
180public MyOnClickListener(int i) {
181index = i;
182}
183
184@Override
185public void onClick(View v) {
186mPager.setCurrentItem(index);
187}
188};
189
190/**
191* 页卡切换监听
192 */
193public class MyOnPageChangeListener implements OnPageChangeListener {
194
195int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
196int two = one * 2;// 页卡1 -> 页卡3 偏移量
197
198@Override
199public void onPageSelected(int arg0) {
200Animation animation = null;
201Intent intent = new Intent();
202switch (arg0) {
203case 0:
204
205Log.d(TAG, "---0---");
206mTabHost.setCurrentTab(0);
207if (currIndex == 1) {
208animation = new TranslateAnimation(one, 0, 0, 0);
209} else if (currIndex == 2) {
210animation = new TranslateAnimation(two, 0, 0, 0);
211}
212break;
213case 1:
214
215Log.d(TAG, "---1---");
216mTabHost.setCurrentTab(1);
217if (currIndex == 0) {
218animation = new TranslateAnimation(offset, one, 0, 0);
219} else if (currIndex == 2) {
220animation = new TranslateAnimation(two, one, 0, 0);
221}
222break;
223case 2:
224
225Log.d(TAG, "---2---");
226mTabHost.setCurrentTab(2);
227if (currIndex == 0) {
228animation = new TranslateAnimation(offset, two, 0, 0);
229} else if (currIndex == 1) {
230animation = new TranslateAnimation(one, two, 0, 0);
231}
232break;
233}
234currIndex = arg0;
235animation.setFillAfter(true);// True:图片停在动画结束位置
236animation.setDuration(300);
237cursor.startAnimation(animation);
238}
239
240@Override
241public void onPageScrolled(int arg0, float arg1, int arg2) {
242}
243
244@Override
245public void onPageScrollStateChanged(int arg0) {
246}
247}
248
249private View getView(String id,Intent intent)
250{
251return manager.startActivity(id, intent).getDecorView();
252}
253 }
至于每个单独页面的layout和java,大家就根据自己的需求写吧。
摘自天狼星主