Android 动画之View动画效果和Activity切换动画效果
View动画效果:
1.>>Tween动画
通过对View的内容进行一系列的图形变换(平移、缩放、旋转、透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节点里可以为下表格中的四种动画标签,也可以包继续含<set>标签;动画的定义xml文件需要添加到res/anim文件夹中;
| 动画类型 | Xml定义动画使用的节点 | 编码定义动画使用的类 |
| 渐变透明度动画效果 | <alpha/> | AlphaAnimation |
| 渐变尺寸缩放动画效果 | <scale/> | ScaleAnimation |
| 画面位置移动动画效果 | <translate/> | TranslateAnimation |
| 画面旋转动画效果 | <rotate/> | RotateAnimation |
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<alpha
android:duration="5000"
android:fromAlpha="1.0"<!-- 1代表可见,0代表不可见 -->
android:toAlpha="0" >
<!-- 持续时间duration -->
</alpha> <rotate
android:duration="5000"
android:fromDegrees="0"
android:pivotX="50%" // 旋转参考点
android:pivotY="50%" // 旋转参考点
android:toDegrees="180" >
</rotate> <scale
android:duration="5000"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="5"
android:toYScale="5" />
<!-- 动画开始时的比例大小,结束时的比例,缩放参考点 --> <translate
android:duration="5000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="50"
android:toYDelta="50" />
<!-- 从(0,0)到(50,50) -->
</set>
在java代码中设置开始动画:
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);// 使用rotate.xml生成动画效果对象
animation.setFillAfter(true);// 动画停止时保持在该动画结束时的状态
ImageView.startAnimation(animation);
Animation animation1 = new RotateAnimation(0, 270, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);// 编码方式
2.>>Frame动画,即顺序播放事先做好的图像,开发步骤:
(1)把定义好的图片放进项目res/drawable下;
(2)在项目的res目录下创建anim文件夹,在此文件夹下定义动画xml文件,每一项静态的图像添加到drawable目录中,或者用编码方式定义动画效果;
(3)为View控件绑定动画效果,调用代表动画的AnimationDrawable的start()方法开始动画;
TextView tv = (TextView) findViewById(R.id.tv);
tv.setBackgroundResource(R.drawable.frame);
// 绑定frame动画,会发送一个消息到主线程的消息队列处理器等待处理,绑定事件完成之后才能进行动画启动
final AnimationDrawable drawable = (AnimationDrawable) findViewById(R.id.tv).getBackground();
// Looper().myQueue():取得消息队列,要消息(事件)处理完成之后才执行addIdleHandler添加进的handler中的方法
Looper.myQueue().addIdleHandler(
new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
drawable.start();// 启动动画,要绑定事件处理完成之后才能启动动画
return false;// 只要执行操作之后就会从消息队列中移出
}
});// 取得处理主线程中处理的消息队列
注意: Frame动画必须使用<animation-list>作为根节点,下面是frame.xml文件的定义;
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" ><!-- 动画只播放一次 -->
<item android:drawable="@drawable/a1" android:duration="500"></item> <!--第一项为一个静态的图像-->
<item android:drawable="@drawable/a2" android:duration="500"></item>
<item android:drawable="@drawable/a3" android:duration="500"></item>
</animation-list>
3.>>属性动画
属性动画可以使对象的属性值在一定时间间隔内变化到某一个值,如在1000毫秒内移动控件的位置(改变x,y的值),在0.5秒内改变alpha属性的值以改变控件透明度,属性动画资源文件位于res/animator目录中;如下是一个属性动画的定义
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" > // 动画执行顺序,默认是同时执行,在此设置为按顺序执行 <set> // 定义x,y的值在0.5秒内移动到(400,300) 在此未设置android:ordering属性,此set则为同时执行
<objectAnimator
android:duration="500"
android:propertyName="x"
android:valueTo="400"
android:valueType="intType" />
<objectAnimator
android:duration="500"
android:propertyName="y"
android:valueTo="300"
android:valueType="intType" />
</set> <objectAnimator
android:duration="500"
android:propertyName="alpha"
android:valueTo="1f" />
</set>
加载属性动画资源文件:
// 加载动画资源
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.aim);
// 设置要控制的对象
set.setTarget(null);
set.start();
4.>>LayoutAnimaionController
LayoutAnimaionController为Layout或者viewGroup里的控件设置动画效果,特点是它会使其中的每个控件都有相同的动画效果,这些控件的动画效果可以在不同的时间显示出来。
mLayout = (LinearLayout) findViewById(R.id.ll);
Animation anim = new TranslateAnimation(0, 200, 0, 0);
anim.setDuration(500);
anim.setFillAfter(true);
LayoutAnimationController layoutAnim = new LayoutAnimationController(anim); // 设置动画
layoutAnim.setOrder(LayoutAnimationController.ORDER_NORMAL); // 设置子View动画顺序
mLayout.setLayoutAnimation(layoutAnim);
关于LayoutAnimaionController,它需要一个Animation对象用于实例化,可以设置子View动画顺序,有三种顺序方式
LayoutAnimaionController .ORDER_NORMAL // 顺序
LayoutAnimaionController .ORDER_REVERSE //反序
LayoutAnimaionController .ORDER_RANDOM //随机
还可以设置延迟setDelay(param);
5.>>Interpolator动画速率
/**
* An interpolator defines the rate of change of an animation. This allows
* the basic animation effects (alpha, scale, translate, rotate) to be
* accelerated, decelerated, repeated, etc.
*/
public interface Interpolator extends TimeInterpolator {
}
查看接口Interpolator的定义,Interpolator接口定义动画改变的速度,如基本的动画效果(透明度、比例、移动、旋转)的加速、减速、重复等;
/**
* TimeInterpolator定义动画速率的改变,允许动画有非固定的运动如加速、减速
*/
public interface TimeInterpolator {
/**
* @param input 一个介于0到1的参数标识当前点的位置,0代表开始,1代表结束
* @return 返回一个动画补插值.这个值可以小于1{在目标的后面}或大于1{在目标的后面}
*/
float getInterpolation(float input);
}
Android已经定义了几个该接口的直接子类,在程序中可以直接调用
——AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。
——DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。
——CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
——Anticipate/Overshoot:往起点方向偏移少量距离再开始加速动画/往终点方向偏移少量距离再结束动画。
——Bounce:弹性效果。
——AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。
——LinearInterpolator:动画从开始到结束,变化率是线性变化。
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true" > <!--表明在下面的动画中分享Interpolator-->
<scale
android:duration="100"
android:fillAfter="false"
android:fromXScale="0.5"
android:fromYScale="0.5"android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="-50"
android:toXScale="1.2"
android:toYScale="1.2" />
</set>
上面是使用系统自带的Interpolator的方法,也可以自定义Interpolator
public class MyInter implements Interpolator {
// ...
@Override
public float getInterpolation(float input) {
// ...
return 0;
}
// ...
}
在使用的时候,使用如下的方式;
ImageView iv = new ImageView(getContext());
Animation animation = AnimationUtils.loadAnimation(getContext(), 0x70982743);
animation.setInterpolator(new MyInter());
iv.startAnimation(animation);
Activity切换动画效果:
关于Activity切换动画效果,网上比较普遍的是overridePendingTransition(enterAnim, exitAnim),但这种方式其实有一些问题;例如:被打开的Activity退出时,并没有动画效果;并且,如果需要当前Activity销毁返回到前一个Activity时,当前Activity和前一个Activity都执行动画,这种方法就根本不能满足了。
言归正传,直接上我淘到的方法:通过Theme对Activity动画效果进行设置
<style name="AppTheme" parent="@android:style/Theme">
<!-- 设置activity切换动画 -->
<item name="android:windowAnimationStyle">@style/activityAnimation</item>
</style>
<!-- animation 样式 -->
<style name="activityAnimation" parent="@android:style/Animation">
<item name="android:activityOpenEnterAnimation">@anim/slide_right_in</item>
<item name="android:activityOpenExitAnimation">@anim/slide_left_out</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_left_in</item>
<item name="android:activityCloseExitAnimation">@anim/slide_right_out</item>
</style>
上面activityAnimation下面四个item对应的动画分别为(假设从Activity A 进入到Activity B):
进入B时B执行的动画;
进入B时A执行的动画;
离开B返回A时A执行的动画;
离开B返回A时B执行的动画;
两个google官方参考链接:
http://developer.android.com/reference/android/R.attr.htmlhttp://developer.android.com/reference/android/R.styleable.html#WindowAnimation
Android 动画之View动画效果和Activity切换动画效果的更多相关文章
- Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS
由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动 ...
- Android 编程下设置 Activity 切换动画
为 Activity 设置切换动画 我们知道,我们可以在 AndroidManifest.xml 文件中,通过 android:theme 属性设置 Activity 的主题.主题中定义了关于 Act ...
- Activity切换动画---点击哪里从哪放大
emmmm,这次来梳理一下 Activity 切换动画的研究.首先,老规矩,看一下效果图: 效果图 这次要实现的动画效果就是类似于上图那样,点击某个 view,就从那个 view 展开下个 Activ ...
- Activity 切换动画和页面切换动画
public class MainActivity extends Activity { private ViewFlipper viewFlipper; private float startX; ...
- Activity切换动画。从右边滑入,关闭时从左边滑入
直接贴代码吧 1. 动画文件(两个动画文件配置到res/anim目录下) activity_anim_in_right.xml <?xml version="1.0" e ...
- Android 之Activity切换动画效果
在Activity中Android提供了overridePendingTransition(int enterAnim,int exitAnim)这个方法用于设置Activity之间切换的动画效果.o ...
- Android Activity 切换动画(非原创)
在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...
- Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)
学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.layout <?xml versi ...
- Android开发中activity切换动画的实现
(1)我们在MainAcitvity中定义两个textview,用于点击触发切换Activity事件,下面是布局文件代码. <LinearLayout android:layout_width= ...
随机推荐
- Spring Boot 2.x Redis多数据源配置(jedis,lettuce)
Spring Boot 2.x Redis多数据源配置(jedis,lettuce) 96 不敢预言的预言家 0.1 2018.11.13 14:22* 字数 65 阅读 727评论 0喜欢 2 多数 ...
- 「专题训练」Air Raid(HDU-1151)
题目 在一个城市里有\(n\)个地点和\(k\)条道路,道路是无环的(也就是说一定可以二分染色--回路长度为偶数0),现在伞兵需要去n个地点视察,只能沿着路的方向走,问最少需要多少伞兵. 分析 这是什 ...
- Qt-QSplashScreen-程序启动动画
多数大型应用程序启动时可会在程序完全启动前显示一个启动画面,在程序完全启动后消失,程序启动画面可以显示相关产品的一些信息,使用户在等待程序启动时同时了解产品的相关功能,这也是一种宣传方式. 首先运行界 ...
- 【WXS全局对象】Math
Math对象用于执行数学任务. 属性: 名称 说明 Math.E 代表算术常量 e,即自然对数的底数,其值近似于 2.71828. Math.LN10 就是 loge10,即 10 的自然对数,其值近 ...
- MongoDB->NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"
关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么 ...
- [Clr via C#读书笔记]Cp14字符字符串和文本处理
Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...
- appcrawler遍历工具常用方法
Usage: appcrawler [options] -a, --app <value> Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项 -c, ...
- Grid 网格布局
CSS 网格布局(Grid Layout) 是CSS中最强大的布局系统. 这是一个二维系统,这意味着它可以同时处理列和行,不像 flexbox 那样主要是一维系统. 你可以通过将CSS规则应用于父元素 ...
- sql server存储特殊字符解决办法
好久没来院子了,最近在学java了,再加上项目比较紧,最近都没怎么上,其实这几天在项目中学到不少东西,都能写下来,但是久而久之就忘了,还是得养成及时总结的好习惯啊,还有有时间一定要把那个小项目整理下来 ...
- 基于深度学习的中文语音识别系统框架(pluse)
目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...