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







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5071900.html,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
28天前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
4月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
115 12
|
4月前
|
XML Android开发 UED
Android动画之共享元素动画简单实践
本文介绍Android共享元素动画, 实现两Activity间平滑过渡特定UI元素。通过设置`transitionName`属性和使用`ActivityOptions.makeSceneTransitionAnimation`启动目标Activity实现动画效果。可自定义过渡动画提升体验。
68 0
|
5月前
|
Android开发 UED
Android Item平移动画
【6月更文挑战第18天】
109 8
|
4月前
|
Android开发
android 动画 插值器和估值器
android 动画 插值器和估值器
|
Android开发
Android平移动画
Android平移动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是组合动画,后面会有。
981 0
|
5天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。