If you like, you can use the Android support package - http://developer.android.com/sdk/compatibility-library.html
With a little effort, you can change your activity to use snippets so your tabs can have transition animations like the YouTube app. Here is a sample code on how to implement it - http://developer.android.com/sdk/compatibility-library.html
Edit: if you do not want to use the support package, perhaps this implementation will help
private class MyGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //get density final DisplayMetrics metrics = getResources().getDisplayMetrics(); final float density = metrics.density; //System.out.println(" in onFling() :: "); //off path if (Math.abs(e1.getY() - e2.getY()) > density*SWIPE_MAX_OFF_PATH) return false; //fling from right to left if (e1.getX() - e2.getX() > density*SWIPE_MIN_DISTANCE && Math.abs(velocityX) > density*SWIPE_THRESHOLD_VELOCITY) { //if the first tab is selected if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_info))) { //switch to second tab and save current selection tabs.setCurrentTab(1); currentSelection = tabs.getCurrentTabTag(); } //if the second tab is selected else if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_details))) { //switch to second tab and save current selection tabs.setCurrentTab(2); currentSelection = tabs.getCurrentTabTag(); } } //fling from left to right else if (e2.getX() - e1.getX() > density*SWIPE_MIN_DISTANCE && Math.abs(velocityX) > density*SWIPE_THRESHOLD_VELOCITY) { //if the second tab is selected if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_details))) { //switch to second tab and save current selection tabs.setCurrentTab(0); currentSelection = tabs.getCurrentTabTag(); } //if the third tab is selected else if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_company))) { //switch to second tab and save current selection tabs.setCurrentTab(1); currentSelection = tabs.getCurrentTabTag(); } } return super.onFling(e1, e2, velocityX, velocityY); } }
and then on the tab, the modified listener, just load the corresponding animation, since you know which one was selected before the gestures, and the one we switch to after.
@Override public void onTabChanged(String tabId) { //if the first tab is selected if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { //if we switch to second if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); linearCompany.setAnimation(null); } //if switch to third else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); linearDetails.setAnimation(null); linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); } } //if the second tab is selected else if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { //if we switch to first if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); linearCompany.setAnimation(null); } //if switch to third else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { linearInfo.setAnimation(null); linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); } } //if the third tab is selected else if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { //if we switch to first if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); linearDetails.setAnimation(null); linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); } //if switch to second else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { linearInfo.setAnimation(null); linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); } } currentSelection = tabId; } };
You also need to catch the gesture by overriding onTouchListener with your regular gesture detector (and maybe consider the different screen densities when deciding if the gesture is active)
Sorry for the long answer, but I hope this helps :)