当前位置: 代码迷 >> Android >> android旋转动画跟平移动画详解,补充说一下如果制作gif动画放到csdn博客上
  详细解决方案

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

热度:92   发布时间:2016-04-28 04:51:36.0
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);			}		});




  相关解决方案