创建如下目录
在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);
}
}
});
}
}