首页 > 代码库 > android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上

android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上

先上效果图:


我这里用的是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移到原点后旋转完再移动到现在的位置
    }
}


如果是上线旋转就把camera.rotateY(degrees)改成camera.rotateX(degrees)


如果是移动的话

<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);
			}
		});