給TabHost加上拖動效果

先說一下第一個示例,我做了一個可以拖動但是無法停留的效果,這個效果的實現是在TabHost的setCurrentTab方法裏面加上動畫,所以得自己寫一個TabHost繼承系統的TabHost並重寫setCurrentTab方法。

那麼我就把這個效果的代碼給大家貼出來

package com.hwh.tab;


import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.TabHost;

/*
 * 自定義TabHost,使tab切換的時候有動畫效果
 */
public class CustomTabHost extends TabHost {
	private Animation slideLeftIn;
	private Animation slideLeftOut;
	private Animation slideRightIn;
	private Animation slideRightOut;

	private int tabCount;// tab頁總數
	private int device_x; //屏幕寬

	public CustomTabHost(Context context, AttributeSet attrs) {
		super(context, attrs);
		Resources resources = getResources();
        DisplayMetrics metrics=resources.getDisplayMetrics();
        device_x=metrics.widthPixels;
        
		initAnima();
	}

	private void initAnima() {
		slideLeftIn=new TranslateAnimation(device_x, 0, 1, 1);
		slideLeftIn.setDuration(500);
		
		slideRightIn=new TranslateAnimation(-device_x,0,1,1);
		slideRightIn.setDuration(500);
		
		slideLeftOut=new TranslateAnimation(0,-device_x,1,1);
		slideLeftOut.setDuration(500);
		
		slideRightOut=new TranslateAnimation(0,device_x,1,1);
		slideRightOut.setDuration(500);
	}
	
	public void setDevice_X(int device_x)
	{
		this.device_x=device_x;
		initAnima();
	}

	public int getTabCount() {
		return tabCount;
	}

	@Override
	public void addTab(TabSpec tabSpec) {
		tabCount++;
		super.addTab(tabSpec);
	}

	
	@Override
	public void setCurrentTab(int index) {
		// index爲要切換到的tab頁索引,currentTabIndex爲現在要當前tab頁的索引
		int currentTabIndex = getCurrentTab();

		// 設置當前tab頁退出時的動畫
		if (null != getCurrentView()) {// 第一次進入MainActivity時,getCurrentView()取得的值爲空
			if (currentTabIndex == (tabCount - 1) && index == 0) {// 處理邊界滑動
				getCurrentView().startAnimation(slideLeftOut);
			} else if (currentTabIndex == 0 && index == (tabCount - 1)) {// 處理邊界滑動
				getCurrentView().startAnimation(slideRightOut);
			} else if (index > currentTabIndex) {// 非邊界情況下從右往左fleep
				getCurrentView().startAnimation(slideLeftOut);
			} else if (index < currentTabIndex) {// 非邊界情況下從左往右fleep
				getCurrentView().startAnimation(slideRightOut);
			}
		}

		super.setCurrentTab(index);

		// 設置即將顯示的tab頁的動畫
		if (currentTabIndex == (tabCount - 1) && index == 0) {// 處理邊界滑動
			getCurrentView().startAnimation(slideLeftIn);
		} else if (currentTabIndex == 0 && index == (tabCount - 1)) {// 處理邊界滑動
			getCurrentView().startAnimation(slideRightIn);
		} else if (index > currentTabIndex) {// 非邊界情況下從右往左fleep
			getCurrentView().startAnimation(slideLeftIn);
		} else if (index < currentTabIndex) {// 非邊界情況下從左往右fleep
			getCurrentView().startAnimation(slideRightIn);
		}
	}
}
這個思路是從網上找到的。TabHost的切換動畫有了,怎麼實現拖動呢。這個就很簡單了,在Activity裏重寫OnTouth方法
@Override
    public boolean onTouchEvent(MotionEvent event) {
    	switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			start_x=(int) event.getX();
			break;
		case MotionEvent.ACTION_UP:
			end_x=(int) event.getX();
			int len=end_x-start_x;
			if(len<0)
			{
				if(Math.abs(len)>device_x/2)
				{
					index+=1;
				}
				//向右
			}if(len>0)
			{
				if(Math.abs(len)>device_x/2)
				{
					index-=1;
				}
			}
			if(index==count)
			{
				index=count-1;
			}
			if(index<0)
			{
				index=0;
			}
			tabHost.setCurrentTab(index);
			break;
		}
    	return false;
    }
這樣就可以拖動了,但是沒辦法實現像ViewPager那樣可以拖動一半的效果。

基於這個原因,我就想能不能把ViewPager和TabHost合併呢,但是有個問題,ViewPager要的是個View,而TabHost裏面是Activity,怎麼把Activity裏的View給得到呢。

一個重要的類:LocalActivityManager,此類有個方法可以得到activity的View,使用startActivity(id, intent).getDecorView()即可得到,其中id可以隨意寫,intent就是對應activity的意圖。思路說完了,下面把代碼貼出來。

顯示佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
        </TabWidget>

    <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" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone" >
        </FrameLayout>
    </LinearLayout>

</TabHost>
Java代碼:
package com.hwh.demo;

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

import android.app.LocalActivityManager;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TextView;

public class DemoActivity extends TabActivity {

        //頁卡內容
        private ViewPager mPager;
        // Tab頁面列表
        private List<View> listViews; 
        // 當前頁卡編號
        private LocalActivityManager manager = null;
        private final Context context = DemoActivity.this;
        private TabHost mTabHost;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
                
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        
        mTabHost =  getTabHost();  
        mTabHost.addTab(mTabHost.newTabSpec("0").setIndicator(  
                "正在聽").setContent(  
                new Intent(this, AActivity.class))); 
        
        mTabHost.addTab(mTabHost.newTabSpec("1").setIndicator(  
                "本地聽").setContent(  
                new Intent(this, BActivity.class))); 
        
        mTabHost.addTab(mTabHost.newTabSpec("2").setIndicator(  
                "網絡聽").setContent(  
                new Intent(this, CActivity.class)));  
        
        mTabHost.setCurrentTab(0);  
        
        //tabhost改變同樣改變ViewPager的內容
        mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
			
			@Override
			public void onTabChanged(String tabId) {
				mPager.setCurrentItem(Integer.parseInt(tabId));
			}
		});
        
        manager = new LocalActivityManager(this, true);
        manager.dispatchCreate(savedInstanceState);
        
        InitViewPager();
    }
    
        /**
         * 初始化ViewPager
         */
        private void InitViewPager() {
                mPager = (ViewPager) findViewById(R.id.vPager);
                listViews = new ArrayList<View>();
                MyPagerAdapter mpAdapter = new MyPagerAdapter(listViews);
                Intent intent = new Intent(context, AActivity.class);
                listViews.add(getView("A", intent));
                Intent intent2 = new Intent(context, BActivity.class);
                listViews.add(getView("B", intent2));
                Intent intent3 = new Intent(context, CActivity.class);
                listViews.add(getView("C", intent3));
                mPager.setAdapter(mpAdapter);
                mPager.setCurrentItem(0);
                mPager.setOnPageChangeListener(new MyOnPageChangeListener());
        }
        
        
        /**
         * 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) {
                }
        }


        /**
         * 頁卡切換監聽,ViewPager改變同樣改變TabHost內容
         */
        public class MyOnPageChangeListener implements OnPageChangeListener {

                @Override
                public void onPageSelected(int arg0) {
                        switch (arg0) {
                        case 0:
                                mTabHost.setCurrentTab(0);  
                                break;
                        case 1:
                                mTabHost.setCurrentTab(1);
                                break;
                        case 2:
                                mTabHost.setCurrentTab(2);
                                break;
                        }
                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                }

                @Override
                public void onPageScrollStateChanged(int arg0) {
                }
        }
        
        private View getView(String id,Intent intent)
        {
                return manager.startActivity(id, intent).getDecorView();
        }
}
到此結束,如有不足之處請指出。


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