Work Better Than Yesterday!
动画知识不难理解,网上学习的资料也很多,官网1、官网2、eoe上面的学习地址、学习资源。
还有一个开源动画库:nineoldandroids,在Github上开源的,它是兼容低版本的。
android的动画主要分这几种:
只要在res/anim下创建动画的资源文件,根节点是
当然,可以在xml文件设置,也可以在代码动态设置动画,四个节点分别对应AlphaAnimation…等等。
加载xml定义的动画:
Animation anima = AnimationUtils.loadAnimation(Context, resourceId);
然后view.startAnimation(anima)
即可。可以start没有stop的,只有clearAnimartion()。
如果不是xml定义的,是分别new的AlphaAnimation这些,就分别start即可。如果在webview里面用补间动画,有时候会花屏,这时候就需要换成帧动画或者属性动画了。
要修改启动activity和关闭activity的动画,就在startActivity或者finish的时候调用:
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
也可以配置全局的,首先配置theme,然后配置为application就OK,如下:
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<!-- 设置没有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 设置activity切换动画 -->
<item name="android:windowAnimationStyle">@style/activityAnimation</item>
</style>
<!-- animation 样式 -->
<style name="activityAnimation" parent="@android:style/Animation">
<item name="android:activityOpenEnterAnimation">@anim/push_left_in</item>
<item name="android:activityOpenExitAnimation">@anim/push_left_out</item>
<item name="android:activityCloseEnterAnimation">@anim/push_right_in</item>
<item name="android:activityCloseExitAnimation">@anim/push_right_out</item>
</style>
上面的接口效率很低的,于是出了新接口高效率使用动画,如下:
ActivityOptionsCompat options = ActivityOptionsCompat.makeCustomAnimation(context,
R.anim.slide_in_from_right, R.anim.slide_out_from_left);
ActivityCompat.startActivity((Activity) context, intent, options.toBundle());
int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
ActivityOptionsCompat options = ActivityOptionsCompat
.makeScaleUpAnimation(view, x/2, y/2, view.getMeasuredWidth(), view.getMeasuredHeight());
ActivityCompat.startActivity((Activity)context, intent, options.toBundle());
ActivityOptionsCompat是一个兼容性接口,可以看更多ActivityOptions。资料1、资料2。
也是定义xml文件,书上说必须放在res/drawable/下,但是网上说放在res/anim/下,我测试了,都可以。xml文件的根节点是
imageview.setBackgroundResource(R.drawable.test);
imageviewAnima = (AnimationDrawable) imageview.getBackground();
imageviewAnima.start();
//下面这种用法已经过时:
animate = (AnimationDrawable) getResources().getDrawable(R.anim.test);
imageview.setBackgroundDrawable(animate);
animate.start();
注意的是:不能在oncreate里面start,因为imageview还没初始化好。
发现一般补间动画就够用了,属性动画看UI那本书的例子就可以。属性动画就是改变view的属性,在一定范围的变化的过程中进行改变。到官网查看一下就知道,不要使用ObjectAnimator,老是有很多属性没效果,使用ValueAnimator,自己的例子如下:
ValueAnimator animator = ValueAnimator.ofInt(mLoginContainerHeight, 0);
animator.setDuration(300).start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (Integer) animation.getAnimatedValue();
mLoginContainer.getLayoutParams().height = value;
mLoginContainer.requestLayout();
}
});