大家好,我是奶綠茶
在開發 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 ArrayList balls = 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();
}
}
}
SourceCodeDownload
留言