选自Android 3.0 Animations Beginners Guide Bring Your Android Applications To Lefe With Stunning Animations
动画http://stackoverflow.com/questions/5151591/android-left-to-right-slide-animation
Viewpper是一个为了翻页动画而封装的小类。它使用tween动画类,并将它们扩展到xml文件。
main.xml
ViewFlipper有两个属性,android:inAnimation和android.outAnimation,可以设置进出动画
<?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:orientation="vertical" > <ViewFlipper android:id="@+id/pages" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text_1_1" /> <ImageView android:id="@+id/rollingball" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="60dp" android:src="@drawable/ball" android:contentDescription="@string/app_name" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text_1_2" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text_2_1" /> <ImageView android:id="@+id/bouncingball" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="60dp" android:src="@drawable/ball" android:contentDescription="@string/app_name" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text_2_2" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text_3_1" /> </ViewFlipper> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:id="@+id/prev" style="?android:attr/buttonBarButtonStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@android:drawable/ic_media_previous" android:text="@string/button_prev" /> <Button android:id="@+id/next" style="?android:attr/buttonBarButtonStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:drawableRight="@android:drawable/ic_media_next" android:text="@string/button_next" /> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" > <translate android:duration="500" android:fromXDelta="100%p" android:toXDelta="0" /> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <translate android:duration="500" android:fromXDelta="0" android:toXDelta="-100%p" /> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" > <translate android:duration="500" android:fromXDelta="-100%p" android:toXDelta="0" /> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <translate android:duration="500" android:fromXDelta="0" android:toXDelta="100%p" /> </set>
package com.animation.interactivebook; import android.os.Bundle; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationSet; //import android.view.animation.AnimationUtils; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.ViewAnimator; public class InteractiveBook extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final View rollingBall = findViewById(R.id.rollingball); ObjectAnimator ballRoller = ObjectAnimator.ofFloat(rollingBall, "TranslationX", 0, 400); ballRoller.setDuration(2000); ballRoller.setRepeatMode(ObjectAnimator.REVERSE); ballRoller.setRepeatCount(ObjectAnimator.INFINITE); ballRoller.start(); final View bouncingBall = findViewById(R.id.bouncingball); ValueAnimator ballBouncer = ValueAnimator.ofInt(0, 40); ValueAnimator.setFrameDelay(50); ballBouncer .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator ballBouncer) { // We'll fill this out in a minute final int animatedValue = (Integer) ballBouncer .getAnimatedValue(); bouncingBall.post(new Runnable() { public void run() { bouncingBall.setPadding( bouncingBall.getPaddingLeft(), 40 - animatedValue, bouncingBall.getPaddingRight(), animatedValue); bouncingBall.invalidate(); } }); } }); ballBouncer.setDuration(2000); ballBouncer.setRepeatMode(ValueAnimator.REVERSE); ballBouncer.setRepeatCount(ValueAnimator.INFINITE); ballBouncer.start(); final AnimationSet slideinToLeft = new AnimationSet(true); TranslateAnimation slide1 = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 1f, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); ScaleAnimation scale1 = new ScaleAnimation(10, 1, 10, 1); slideinToLeft.addAnimation(slide1); slideinToLeft.addAnimation(scale1); slideinToLeft.setDuration(1000); final AnimationSet slideoutToLeft = new AnimationSet(true); TranslateAnimation slide2 = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, -1f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); ScaleAnimation scale2 = new ScaleAnimation(1, 10, 1, 10); slideoutToLeft.addAnimation(slide2); slideoutToLeft.addAnimation(scale2); slideoutToLeft.setDuration(1000); final AnimationSet slideinToRight = new AnimationSet(true); TranslateAnimation slide3 = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, -1f, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); ScaleAnimation scale3 = new ScaleAnimation(10, 1, 10, 1); slideinToRight.addAnimation(slide3); slideinToRight.addAnimation(scale3); slideinToRight.setDuration(1000); final AnimationSet slideoutToRight = new AnimationSet(true); TranslateAnimation slide4 = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 1f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); ScaleAnimation scale4 = new ScaleAnimation(1, 10, 1, 10); slideoutToRight.addAnimation(slide4); slideoutToRight.addAnimation(scale4); slideoutToRight.setDuration(1000); final ViewAnimator pages = (ViewAnimator) findViewById(R.id.pages); Button prev = (Button) findViewById(R.id.prev); Button next = (Button) findViewById(R.id.next); prev.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // pages.clearAnimation(); // Animation inAnimation = // AnimationUtils.loadAnimation(InteractiveBook.this, // R.anim.slidein_to_right); // Animation outAnimation = // AnimationUtils.loadAnimation(InteractiveBook.this, // R.anim.slideout_to_right); // pages.setInAnimation(inAnimation); // pages.setOutAnimation(outAnimation); pages.clearAnimation(); pages.setInAnimation(slideinToRight); pages.setOutAnimation(slideoutToRight); pages.showPrevious(); } }); next.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // pages.clearAnimation(); // Animation inAnimation = // AnimationUtils.loadAnimation(InteractiveBook.this, // R.anim.slidein_to_left); // Animation outAnimation = // AnimationUtils.loadAnimation(InteractiveBook.this, // R.anim.slideout_to_left); // pages.setInAnimation(inAnimation); // pages.setOutAnimation(outAnimation); pages.clearAnimation(); pages.setInAnimation(slideinToLeft); pages.setOutAnimation(slideoutToLeft); pages.showNext(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.interactive_book, menu); return true; } }