您的位置:首页 > 移动开发 > Android开发

android动画

2016-03-18 16:47 447 查看
动画分类

变换动画Tween

布局动画Layout

帧动画Frame

属性动画Property

Annimation 动画使用方式

1 配置文件方式 /res/anim – alpha,scale, translate,rotate

使用的时候加载文件AnimationUtils.loadAnimation :

Animation scale = AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale_anim);
img.startAnimation(scale);


2 java代码方式 AlphaAnimation ScaleAnimation, TranslateAnimation , RotateAnimation

当一些参数需要计算, 动态确定 , 就使用代码方式, 否则使用配置文件方式

Animation alpha = new AlphaAnimation(0.1f, 1.0f);
alpha.setDuration(5000);
img.startAnimation(alpha);


Tween Animation 动画

Tween Animation:变换动画分类:

- alpha渐变透明度动画

- scale渐变尺寸动画

- translate位置移动动画

- rotate旋转动画

Tween Animation 共同属性

Duration: 动画持续时间毫秒

fillAfter: true的话 动画转化在动画结束后被应用

fillBefore: true的话 动画转化在动画开始前被应用

interpolator: 动画插入器 加速,减速插入器

repeatCount: 动画重复次数

repateMode: 顺序重复/倒序重复

startOffset: 动画之间的时间间隔

透明度动画

常用属性:

fromAlpha 动画起始透明度

toAlpha 终止时透明度

xml文件方式示例:

//Activity

case R.id.alpha: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
image.startAnimation(loadAnimation);
break;
}


//alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<alpha
android:duration="1000"
android:fromAlpha="0.1"
android:toAlpha="1.0" >
</alpha>

</set>


缩放动画 ScaleAnimation

常用属性:

fromX,toX x坐标伸缩尺寸

fromY,toY Y坐标伸缩尺寸

pivoX,pivoY 伸缩动画相对于,x,y坐标开始的位置

case R.id.scale: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.scale);
image.startAnimation(loadAnimation);
break;
}


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<scale
android:duration="2000"
android:fillAfter="false"           //动画完成后是否保持最后的状态, false不保存, 即回到原本状态
android:fromXScale="0.0"
android:fromYScale="0.0"
//动画插入器, 先加速后减速
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"            //设置缩放中心 , 为中心点
android:pivotY="50%"            //设置缩放中心 , 为中心点
android:toXScale="1.0"
android:toYScale="1.0" />

</set>


位移动画

常用属性:

fromXdelta , fromYDelta 起始X,Y

toXDelta, toYDelta 结束时X,Y

case R.id.translate: {

loadAnimation = AnimationUtils
.loadAnimation(this, R.anim.translate);
image.startAnimation(loadAnimation);
break;
}


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
android:duration="1000"
android:fromXDelta="10"
android:fromYDelta="10"
android:toXDelta="100"
android:toYDelta="100" />

</set>


RotateAnimation 旋转动画

常用属性:

fromDegree 起始角度

toDegree 终止角度

pivotX,pivotY 旋转中心点

case R.id.rotate: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
image.startAnimation(loadAnimation);
break;
}


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<rotate
android:duration="1000"
android:fromDegrees="0"
// 先加速后减速
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+360" />

</set>


组合动画

设置 AnimationListener

例1: 先动画A , 设置A的AnimationListener , 当onAnimationEnd触发(即A播放完毕)时, 开始播放B.

case R.id.continue_btn: {
loadAnimation = AnimationUtils
.loadAnimation(this, R.anim.translate);
image.startAnimation(loadAnimation);
//结束时准备调用的动画, 要在回调中使用, 所以要设置为final
final Animation loadAnimation2 = AnimationUtils.loadAnimation(this,
R.anim.rotate);
loadAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}

@Override
public void onAnimationRepeat(Animation arg0) {
}

@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
image.startAnimation(loadAnimation2);
}
});
break;
}


动画集 AnimationSet

例2: 使用动画集 AnimationSet ,其中定义动画A, B 为动画B设置startOffset , 其值为前一个动画播放所需要的时间

//startOffset 动画延迟时间

//Activity

case R.id.continue_btn2: {
loadAnimation = AnimationUtils.loadAnimation(this,
R.anim.continue_anim);
image.startAnimation(loadAnimation);
break;
}


//continue_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<alpha
android:duration="3000"
android:fromAlpha="0.2"
android:toAlpha="1.0" />
<alpha
android:duration="3000"
android:fromAlpha="1.0"
// 上一个动画duration 3秒, 这里设置startOffset 延迟3秒, 于是实现了连续播放, 组合动画
android:startOffset="3000"
android:toAlpha="0.2" />

</set>


setRepeatCount , setRepeatMode

例3: 循环闪烁 利用Animation 的setRepeatCount, setRepeatMode来实现动画循环

使用透明度动画循环

case R.id.flash: {

AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
alphaAnimation.setDuration(100);
alphaAnimation.setRepeatCount(10);
// 倒序重复REVERSE 正序重复RESTART
alphaAnimation.setRepeatMode(Animation.REVERSE);
image.startAnimation(alphaAnimation);

break;
}


overridePendingTransition 方法 Activity切换动画

例4: Activity切换动画, 使用overridePendingTransition方法

参数1: 第二个activity 进入动画配置文件

参数2: 第一个activity退出动画配置文件

case R.id.change: {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
//第一个参数指定新启动的activity由小变大zoom_in ,
//第二个参数指定当前activity 由大变小zoom_out
overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out);
break;
}


//zoom_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator" >

<scale
android:duration="1000"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
<alpha
android:duration="1000"
android:fromAlpha="0"
android:toAlpha="1.0" />
</set>


//zoom_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:zAdjustment="top" >

<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="0.1"
android:toYScale="0.1" />

<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0" />

</set>


布局动画 Layout Animation

为View Groups 添加动画

使用LayoutAnimationController , 来加载动画,应用到layout下每一个子view

例子中 R.anim.zoom_in和上面使用的是同样的文件

protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
listView=(ListView) findViewById(R.id.listView);
List<String>list=new ArrayList<String>();
for(int i=0;i<20;i++)
{
list.add("测试数据"+i);
}
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
//生成布局动画控制器, 并加载动画
LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in));
//设置动画顺序
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 应用动画
listView.setLayoutAnimation(lac);
listView.startLayoutAnimation(); //按设置, 对子view动画依次播放
}


逐帧动画 FrameAnimation

drawable下建xml文件, 用animation-list标签(item标签集合),

一个item标签定义要显示的drawable下图片(帧图),且指定显示它的时间(毫秒为单位), 如

//anim_list.xml , “@drawable/one” ,”@drawable/two” 这些都是准备好的图片 , 每幅图片停留时间为500毫秒

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:drawable="@drawable/one"
android:duration="500"/>
<item
android:drawable="@drawable/two"
android:duration="500"/>
<item
android:drawable="@drawable/three"
android:duration="500"/>
<item
android:drawable="@drawable/four"
android:duration="500"/>
<item
android:drawable="@drawable/five"
android:duration="500"/>
<item
android:drawable="@drawable/six"
android:duration="500"/>

</animation-list>


//使用该动画, 逐帧动画

逐帧动画 除start外还有一些控制方法 可参考:

/article/4903196.html

case R.id.frame: {
//直接只是加载动画图片 setImageResource 到ImageView,  在很多情况下动画不会运行, 必须先生成AnimationDrawable对象
//          image.setImageResource(R.drawable.anim_list);

AnimationDrawable aniDrawable = null ;
/*  方法1:
//          aniDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_list);
//          image.setBackground(aniDrawable);
aniDrawable.start();
*/

// 方法2:
image.setImageResource(R.drawable.anim_list);
aniDrawable = (AnimationDrawable) image.getDrawable();
aniDrawable.start();
break;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: