zoukankan      html  css  js  c++  java
  • 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);
    			}
    		});




  • 相关阅读:
    linux学习记录-----vsftpd服务安装配置
    PTA数据结构第一次作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5071900.html
Copyright © 2011-2022 走看看