Android之动画处理

创建如下目录
在res/anim/myanim.xml 写关于动画的代码
在这里插入图片描述
代码如下:
描述了四种常见的动画效果以及使用
alpha 透明度
scale 尺寸大小(注意中心点,插入器)
translate 平移
rotate 旋转(注意中心点,插入器)

<?xml version="1.0" encoding="utf-8"?>				<!-- XML的版本以及编码方式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
  <alpha
	android:fromAlpha="0.1" 
	android:toAlpha="1.0" 
	android:duration="2000" 
  /> 										<!-- 透明度的变换 -->
  <scale
	android:interpolator= "@android:anim/accelerate_decelerate_interpolator" 
	android:fromXScale="0.0" 
	android:toXScale="1.4" 
	android:fromYScale="0.0" 
	android:toYScale="1.4" 
	android:pivotX="50%" 
	android:pivotY="50%"
	android:fillAfter="false" 
	android:duration="3000"
  /> 										<!-- 尺寸的变换 -->
  <translate
	android:fromXDelta="30" 
	android:toXDelta="0" 
	android:fromYDelta="30"
	android:toYDelta="50" 
	android:duration="3000" 
  />											<!-- 位置的变换 -->
  <rotate
	android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
	android:fromDegrees="0" 
	android:toDegrees="+350" 
	android:pivotX="50%" 
	android:pivotY="50%"
	android:duration="3000"
  /> 										<!-- 旋转变换 -->
</set>

然后在另一个目录下
res/layout/main.xml 其布局就是一个LinearLayout 和ImageView
在这里插入图片描述

Activity代码

public class CustomAnimActivity extends Activity {
    Animation myAnimation;					//动画的引用
    ImageView myImageView;					//ImageView的引用

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //设置当前显示的View
        setContentView(R.layout.main);
        //加载动画
        myAnimation= AnimationUtils.loadAnimation(this,R.anim.myanim);
        //得到ImageView的引用
        myImageView = (ImageView) this.findViewById(R.id.myImageView);
        //启动动画
        myImageView.startAnimation(myAnimation);
    }
}

其实动画Animation 本质上就是个View 只要是View就能启动动画效果(比如按钮,文本框啊等等)
使用动画的步骤:
创建动画引用,创建View的引用->
加载动画(两个参数,参数1 上下文对象,参数2动画的xml文件)->
获取View->
通过View启动动画(传入参数 Animation类)
共 4个步骤

动画的种类
Android动画可以分为以下3种:
View Animation
视图动画,通多对整个视图不断做图像的变换(平移、缩放、旋转、透明度)产生的动画效果,是一种渐进式动画。

Drawable Animation
图片动画,其实也是逐帧动画,是通过一个接一个的加载Drawable资源来创建动画,按顺序的播放,像一个胶卷。对于视图动画,他只是单独的图片内容在变换,而不是整个视图。很显然,如果图片过多多大就会导致OOM异常。

Property Animation
属性动画,在Android3.0的(API级别11)引入的,该属性动画系统可以制作动画的任何对象的属性。但是一般来说,属性动画系统是首选的使用方法,因为它更灵活,并提供更多功能。

对于动画的分类,也有不同的,分为2类:View Animation 和 Property Animation,其中 View Animation又可以分为:补间动画和逐帧动画。其实内容多是以上三种,就不纠结这个了。
接下来,将会介绍这三种动画,并实现demo。这篇的主角是View Animation。


本文来自 M-Ellen 的CSDN 博客
,全文地址请点击:https://blog.csdn.net/pzm1993/article/details/77167049?utm_source=copy

如果想对动画了解的更加具体可以去访问该博主的博客(很详细)别的我就不多说了

=================================================================

动画的小使用

Demo1

动画效果就是平移 可能图片展现的不太好 就相当于平常的切界面而已(滑动效果)
这个demo主要讲如何巧妙的在java里面使用Animation
在这里插入图片描述
在这里插入图片描述
由于互相切有4个动画效果
1.主界面的左上角的坐标从(0,0)->(100%p,0)
2.子界面的左上角的坐标从(-100%p,0)->(0,0)

3.子界面的左上角的坐标从(0,0)->(-100%p,0)
4.主界面的左上角的坐标从(100%p,0)->(0,0)
在这里插入图片描述

自定义动画工具类

很推荐这种代码的写法(自定义动画工具类 只需要初始化动画 然后需要的时候去启动就好)
setFillAfter(false) 动画效果完成后不保留该动画效果了
自定义方法 四个参数(原来的View ,Layout的id,Layout中View的id,Activity)
在这里插入图片描述

//动画切换界面的工具类
public class TransformUtil
{
	//去动画中两个界面子动画
	static Animation visibleAnimationGo;
	static Animation goneAnimationGo;
	//返回动画中两个界面子动画
	static Animation goneAnimationBack;
	static Animation visibleAnimationBack;

	//初始化去新界面及返回旧界面的动画
	public static void initTransorfm(Context context)
	{
		//去新界面动画的初始化
		visibleAnimationGo = AnimationUtils.loadAnimation(context,R.anim.myanim_visible_go);
		goneAnimationGo = AnimationUtils.loadAnimation(context,R.anim.myanim_gone_go);
		visibleAnimationGo.setFillAfter(false);
		goneAnimationGo.setFillAfter(false);
		visibleAnimationGo.setInterpolator(new AccelerateInterpolator());
		goneAnimationGo.setInterpolator(new AccelerateInterpolator());

		//返回旧界面动画的初始化
		visibleAnimationBack =AnimationUtils.loadAnimation(context,R.anim.myanim_visible_back);
		goneAnimationBack = AnimationUtils.loadAnimation(context,R.anim.myanim_gone_back);
		goneAnimationBack.setFillAfter(false);
		visibleAnimationBack.setFillAfter(false);
		visibleAnimationBack.setInterpolator(new AccelerateInterpolator());
		goneAnimationBack.setInterpolator(new AccelerateInterpolator());
	}

	//去下一界面的切换方法
	public static void goTransorfm
	(
			View from, //出发界面总View
			int layoutTo,//目标界面Layout id
			int toId, //目标界面总View id
			Activity activity
	)
	{
		from.startAnimation(goneAnimationGo);
		activity.setContentView(layoutTo);
		View layoutTarget = activity.findViewById(toId);
		layoutTarget.startAnimation(visibleAnimationGo);
	}

	//返回上一界面的切换方法
	public static void backTransorfm
	(
			View from, //出发界面总View
			int toLayout,//目标界面Layout id
			int toId, //目标界面总View id
			Activity activity
	)
	{
		from.startAnimation(goneAnimationBack);
		activity.setContentView(toLayout);
		final View layoutFrom =activity.findViewById(toId);
		layoutFrom.startAnimation(visibleAnimationBack);
	}
}

下面是Activity的代码

public class LoadTransitionMoveActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//初始化切换动画
		TransformUtil.initTransorfm(this);
		//切换到主界面
		setContentView(R.layout.main);
		//为主界面中去下一界面按钮添加监听器
		Button b1 = (Button) findViewById(R.id.button1);
		b1.setEnabled(true);
		b1.setOnClickListener(new Button.OnClickListener()
		{
			public void onClick(View v)
			{
				gotoDetail();
			}
		});
	}

	//去主界面
	public void gotoMain()
	{
		final Activity activity=LoadTransitionMoveActivity.this;
		//获取from View
		View layoutFrom = findViewById(R.id.layout2);
		//去主界面
		TransformUtil.backTransorfm(layoutFrom,R.layout.main,R.id.layout1,activity);
		//给主界面中去子界面的按钮添加监听器
		Button b1 = (Button) findViewById(R.id.button1);
		b1.setEnabled(true);
		b1.setOnClickListener(new Button.OnClickListener()
		{
			public void onClick(View v)
			{
				gotoDetail();
			}
		});
	}

	//去子界面
	public void gotoDetail()
	{
		final Activity activity=LoadTransitionMoveActivity.this;
		//获取from View
		View layoutFrom = findViewById(R.id.layout1);
		//去子界面
		TransformUtil.goTransorfm(layoutFrom,R.layout.mylayout,R.id.layout2,activity);
		//给子界面的返回按钮添加监听器
		Button b2 = (Button) findViewById(R.id.button2);
		b2.setEnabled(true);
		b2.setOnClickListener(new Button.OnClickListener()
		{
			public void onClick(View v)
			{
				gotoMain();
			}
		});
	}
}

Demo2

生气的文本编辑框(输错了数据便开始抖动)
这个demo主要讲动画的组合使用和循环
先看抖动的代码
期中插入了别的xml文件

<?xml version="1.0" encoding="utf-8"?>
<set 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@anim/cycle" 
> 
<!-- 左上子动画 -->
<translate 
   android:fromXDelta="0" 
   android:toXDelta="-10" 
   android:fromYDelta="0" 
   android:toYDelta="-10" 
   android:duration="300"    
/>
<!-- 右上子动画 -->
<translate 
   android:fromXDelta="0" 
   android:toXDelta="10" 
   android:fromYDelta="0" 
   android:toYDelta="-10" 
   android:startOffset="300"
   android:duration="300"    
/>
<!-- 左下子动画 -->
<translate 
   android:fromXDelta="0" 
   android:toXDelta="-10" 
   android:fromYDelta="0" 
   android:toYDelta="10" 
   android:startOffset="600"
   android:duration="300"    
/>
<!-- 右下子动画 -->
<translate 
   android:fromXDelta="0" 
   android:toXDelta="10" 
   android:fromYDelta="0" 
   android:toYDelta="10" 
   android:startOffset="900"
   android:duration="300"    
/>

在cycle.xml中
在这里插入图片描述

Activity代码

public class AngryEditTextActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//切换到主界面
		setContentView(R.layout.main);
		//为主界面中确定按钮添加监听器
		Button b1 = (Button) findViewById(R.id.button1);
		b1.setEnabled(true);
		b1.setOnClickListener(new Button.OnClickListener()
		{
			public void onClick(View v)
			{
				EditText et=(EditText)findViewById(R.id.EditText01);
				String nr=et.getText().toString().trim();
				if(nr.equals("1234"))
				{
					Toast.makeText
							(
									AngryEditTextActivity.this,
									"恭喜您,猜对了!!!",
									Toast.LENGTH_SHORT
							).show();
				}
				else
				{
					Animation shake = AnimationUtils.loadAnimation(AngryEditTextActivity.this, R.anim.shake);
					et.startAnimation(shake);
				}
			}
		});
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41910103/article/details/82924889