大家好,我是奶綠茶
在開發 Android, 經常會需要做一些動畫
在新版的 SDK 裡有個 ValueAnimator 可以使用
法簡單好學, 寫起來跟 Flash 的 TweenMax 差不多, 這就是我們要的
可惜官方說需要 SDK 11 以上的機子才能跑
經過測試也還真的需要 11 以上, (11 是代號 HoneyComb)
後來想到 Android 是 OpenSource, 就把他的類別拿來改一下, 這樣就可以在 2.2 的舊機子上使用
轉載請註明出處
在開發 Android, 經常會需要做一些動畫
在新版的 SDK 裡有個 ValueAnimator 可以使用
法簡單好學, 寫起來跟 Flash 的 TweenMax 差不多, 這就是我們要的
可惜官方說需要 SDK 11 以上的機子才能跑
經過測試也還真的需要 11 以上, (11 是代號 HoneyComb)
後來想到 Android 是 OpenSource, 就把他的類別拿來改一下, 這樣就可以在 2.2 的舊機子上使用
轉載請註明出處
bounceAnim = ValueAnimator.ofFloat( 起始值, 目標值); bounceAnim.setDuration( 1500 ); // 時間 bounceAnim.addUpdateListener 偵聽更新事件。看吧,簡單好學, 不過這樣的方法依然無法使用 ObjectAnimator 這個類別, 反正 ValueAnimator 就己經夠用了 以下程式碼是改至官方提供的 API, 我把他改成 2.2 也可以跑的範例
package milkmidi.demo; import java.util.ArrayList; import milkmidi.android.animation.ValueAnimator; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RadialGradient; import android.graphics.Shader; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.os.Bundle; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.widget.Button; import android.widget.LinearLayout; public class Ch6_05_sdk15ExampleActivity extends Activity { @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.animation_reversing ); LinearLayout container = (LinearLayout) findViewById( R.id.container ); final MyAnimationView animView = new MyAnimationView( this ); container.addView( animView ); Button starter = (Button) findViewById( R.id.startButton ); starter.setOnClickListener( new View.OnClickListener() { public void onClick( View v ) { animView.startAnimation(); } } ); Button reverser = (Button) findViewById( R.id.reverseButton ); reverser.setOnClickListener( new View.OnClickListener() { public void onClick( View v ) { animView.reverseAnimation(); } } ); } public class MyAnimationView extends View { public final ArrayListSourceCodeDownloadballs = new ArrayList (); ValueAnimator bounceAnim = null; ShapeHolder ball = null; public MyAnimationView( Context context ) { super( context ); ball = createBall( 25, 25 ); } private void createAnimation() { if ( bounceAnim == null ) { // 這個不能使用 //bounceAnim = ObjectAnimator.ofFloat(ball, "y", ball.getY(), getHeight() - 50f); bounceAnim = ValueAnimator.ofFloat( ball.getY(), getHeight() - 50f ); bounceAnim.setDuration( 1500 ); bounceAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { //float valueY = (Float)animation.getAnimatedValue("y"); float value = (Float) animation.getAnimatedValue(); ball.setY( value ); invalidate(); } }); bounceAnim.setInterpolator( new AccelerateInterpolator( 2f ) ); } } public void startAnimation() { createAnimation(); bounceAnim.start(); } public void reverseAnimation() { createAnimation(); bounceAnim.reverse(); } public void seek( long seekTime ) { createAnimation(); bounceAnim.setCurrentPlayTime( seekTime ); } private ShapeHolder createBall( float x, float y ) { OvalShape circle = new OvalShape(); circle.resize( 50f, 50f ); ShapeDrawable drawable = new ShapeDrawable( circle ); ShapeHolder shapeHolder = new ShapeHolder( drawable ); shapeHolder.setX( x - 25f ); shapeHolder.setY( y - 25f ); int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); int color = 0xff000000 | red << 16 | green << 8 | blue; Paint paint = drawable.getPaint(); // new // Paint(Paint.ANTI_ALIAS_FLAG); int darkColor = 0xff000000 | red / 4 << 16 | green / 4 << 8 | blue / 4; RadialGradient gradient = new RadialGradient( 37.5f, 12.5f, 50f, color, darkColor, Shader.TileMode.CLAMP ); paint.setShader( gradient ); shapeHolder.setPaint( paint ); return shapeHolder; } @Override protected void onDraw( Canvas canvas ) { canvas.save(); canvas.translate( ball.getX(), ball.getY() ); ball.getShape().draw( canvas ); canvas.restore(); } } }
留言