先上效果图:
我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载,
制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面。点击Rec的new先,然后点击Rec,然后就save到本地成gif文件
这里做一个左右旋转。上下旋转,和左右移动的动画。先自己建立一个View的类,作为操作的对象:
public class MyView extends View { private Paint mPaint; int width = 0; int height = 0; public MyView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setStrokeWidth(5); mPaint.setColor(Color.RED); this.setBackgroundColor(Color.RED); width = context.getResources().getDimensionPixelSize(R.dimen.width); height = context.getResources().getDimensionPixelSize(R.dimen.height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //width 300 height 300 canvas.drawLine(0, 0, width, 0, mPaint); canvas.drawLine(width, 0, width, height, mPaint); canvas.drawLine(width, height, 0, height, mPaint); canvas.drawLine(0, height, 0, 0, mPaint); canvas.save(); } }
左右旋转动画:
public class RotateLeftRightAnimation extends Animation { private final float mFromDegrees; private final float mToDegrees; private final float mCenterX; private final float mCenterY; private final float mDepthZ; private final boolean mReverse; private Camera mCamera; private InterpolatedTimeListener listener; public RotateLeftRightAnimation(float fromDegrees, float toDegrees, float centerX, float centerY, float depthZ, boolean reverse) { mFromDegrees = fromDegrees; mToDegrees = toDegrees; mCenterX = centerX; mCenterY = centerY; mDepthZ = depthZ; mReverse = reverse; } public static interface InterpolatedTimeListener { public void interpolatedTime(float interpolatedTime); } public void setInterpolatedTimeListener(InterpolatedTimeListener listener) { this.listener = listener; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if (listener != null) { listener.interpolatedTime(interpolatedTime); } final float fromDegrees = mFromDegrees; float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); boolean overHalf = (interpolatedTime > 0.5f); if (overHalf) { degrees = degrees - 180; } final float centerX = mCenterX; final float centerY = mCenterY; final Camera camera = mCamera; final Matrix matrix = t.getMatrix(); camera.save(); if (mReverse) { camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); } else { camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); } <span style="color:#ff0000;">camera.rotateY(degrees); //这个Y轴旋转就是左右旋转</span> camera.getMatrix(matrix); camera.restore(); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY);//这两句的意思是把View移到原点后旋转完再移动到如今的位置 } }
假设是移动的话
<span style="color:#330033;">public class MoveAnimation extends Animation { private Camera mCamera; private float mMoveDistance; private InterpolatedTimeListener listener; public MoveAnimation(float moveDistance) { mMoveDistance = moveDistance; } public static interface InterpolatedTimeListener { public void interpolatedTime(float interpolatedTime); } public void setInterpolatedTimeListener(InterpolatedTimeListener listener) { this.listener = listener; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if (listener != null) { listener.interpolatedTime(interpolatedTime); } final Camera camera = mCamera; final Matrix matrix = t.getMatrix(); camera.save(); camera.getMatrix(matrix); camera.restore(); matrix.postTranslate(mMoveDistance, 0); } }</span>
然后主程序这样来调用:
final MyView myView = (MyView) findViewById(R.id.myview); Button btn = (Button) findViewById(R.id.btn_move); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MoveAnimation anim = new MoveAnimation(200); anim.setDuration(500); myView.startAnimation(anim); } }); Button btn_up_down_rotate = (Button) findViewById(R.id.btn_up_down_rotate); btn_up_down_rotate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RotateUpDownAnimation anim = new RotateUpDownAnimation(0, 180, v.getWidth() / 2, v.getHeight() / 2, 0, false); anim.setDuration(500); myView.startAnimation(anim); } }); Button btn_left_right_rotate = (Button) findViewById(R.id.btn_left_right_rotate); btn_left_right_rotate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RotateLeftRightAnimation anim = new RotateLeftRightAnimation(0, 180, v.getWidth() / 2, v.getHeight() / 2, 0, false); anim.setDuration(500); myView.startAnimation(anim); } });