android 属性动画
一直再追郭霖的博客和imooc上的一些新的视频,最近有讲到属性动画。
以下内容为博客学习以及imooc上视频资料的学习笔记:
在3.0之前比较常见的动画为tween动画和frame动画:
tween动画:就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变);
frame动画:即顺序的播放事先做好的图像,与gif图片原理类似,也类似电影效果。
在3.0以后除了支持以上两种动画以外,还增加了一个新的动画:
property animation----属性动画。
传统的animation动画,旧的animation只适合显示效果,不适合交互动画
TranslateAnimation 位移动画
虽然Imageview可以移动,但是移动后的imageview无法单击,而在旧的位置可以单击,这就是旧的animation的效果。
ofFloat第一个参数为要操控的控件,第二个为要操作的属性,第三个以及第四个为操作的范围。
setDuration为操作的时间长度。
属性动画在移动后的控件位置点击可以toast.
实现控件旋转360度。
多个属性动画的使用:
PropertyValuesHolder:来控制多个属性的共同作用:
多个属性动画效果:palyTogether
按照顺序进行动画播放:playSequentially
动画监听事件:
另外一种添加事件的监听:
有层次的动画显示风格:
setStartDelay()设置延迟时间的属性
插值器:
setInterpolator(new BounceInterpolator());
ValueAnimator:
ObjectAnimator 继承自ValueAnimator,用来产生一定规律的数字,从而控制动画的实现过程。
AnimatorUpdateListener用来监听数值的变换。
五秒内button上的内容从1到100:
通过对数值的处理进行动画效果的处理
常用属性:
translationX ,translationY----偏移距离,作为一种增量控制view从布局左上角开始的位置。
rotation , rotationX ,rotationY,----水平或者竖直方向旋转动画,围绕支点进行2D或者3D旋转。
scaleX,scaleY----X方向,Y方向的缩放动画,2D缩放。
pivotX,pivotY--view对象支点位置,围绕该支点进行旋转和缩放变换操作。
x和Y,--view对象最终位置,起始位置为左上角坐标+偏移距离。
alpha:透明度,1不透明,0,完全透明。
X,Y,移动到具体那个坐标
alpha 透明度
常用的方法和类:
ValueAnimator----数值发生器
ObjectAnimator----ValueAnimator子类
AnimatorUpdateListener---动画监听事件
AnimatorListenerAdapter
PropertyValuesHolder
AnimatorSet----动画集合,即可以同时对一个对象应用几个动画,这些动画可以同时播放也可以对不同动画设置不同开始偏移
TypeEvaluators----根据属性的开始、结束值与TimeInterpolation计算出的因子计算出当前时间的属性值
Interplators
nterplators图解:
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator 反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动 至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性,线性均匀改变
OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值
TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口
来源: <http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html>
相关进阶资料:
http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html
AnimatorSeth和AnimatorListener:http://blog.csdn.net/new_abc/article/details/40143091
使用ObjectAnimator设置动画:http://blog.csdn.net/new_abc/article/details/40106569
使用ValueAnimator设置动画:http://blog.csdn.net/new_abc/article/details/40072499
在xml中使用属性动画,下面几篇文章讲的非常之详细
《Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法》
《Animation动画详解(二)——Interpolator插值器》
《Animation动画详解(三)—— 代码生成alpha、scale、translate、rotate、set及插值器动画》
加载布局里面的动画:
首先anim文件夹下面定义动画,比如:
R.anim.rotate_one.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="-180" > </rotate>
BasicXMLAnimationActivity.java文件中调用
package com.example.viewanimation.basic; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import com.example.helloanimation.R; public class BasicXMLAnimationActivity extends Activity { private Animation mTurnupAnimation;
private Animation mTurndownAnimation;
private Animation mTranslateAnimationOne;
private Animation mTranslateAnimationTwo;
private Animation mAlphaAnimationSet;
private Animation mScaleAnimation; private View mStartButton = null;
private View mTargetView = null;
private int mStateId = 0;
private int mStateCount = 6; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_view_animation);
initAnimations();
mStartButton = findViewById(R.id.startButton);
mStartButton.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { playAnimations();
}
});
mTargetView = findViewById(R.id.target);
} private void initAnimations() {
mTurnupAnimation = AnimationUtils
.loadAnimation(this, R.anim.rotate_one); mTurndownAnimation = AnimationUtils.loadAnimation(this,
R.anim.rotate_two); mTranslateAnimationOne = AnimationUtils.loadAnimation(this,
R.anim.translate_one); mTranslateAnimationTwo = AnimationUtils.loadAnimation(this,
R.anim.translate_two); mAlphaAnimationSet = AnimationUtils.loadAnimation(this,
R.anim.alpha_ani_set); mScaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_one); } private void playAnimations() {
switch (mStateId) {
case 0:
mTargetView.startAnimation(mTurndownAnimation);
break;
case 1:
mTargetView.startAnimation(mTurnupAnimation);
break;
case 2:
mTargetView.startAnimation(mTranslateAnimationOne);
break;
case 3:
mTargetView.startAnimation(mTranslateAnimationTwo);
break;
case 4:
mTargetView.startAnimation(mAlphaAnimationSet);
break;
case 5:
mTargetView.startAnimation(mScaleAnimation);
break; default:
break;
} mStateId = (++mStateId) % mStateCount; }
}
android 布局动画
LayoutTransition
对ViewGroup中的View改变进行动画显示
<LinearLayout android:id="@+id/container"
android:animateLayoutChanges="true"
...
/>
代码中使用:
private ViewGroup mContainerView;
...
private void addItem() {
View newView;
...
mContainerView.addView(newView, 0);
}
生成transition对象:
mTransitioner = new LayoutTransition();
container.setLayoutTransition(mTransitioner);
为transition添加动画:
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f,
0f).setDuration(
mTransitioner.getDuration(LayoutTransition.APPEARING));
mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
animIn.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationY(0f);
}
});
属性动画之插值器
属性动画之插值器
定义:定义动画变换效率,控制目标变量的变化值进行对应的变化,同样,一个动画变换起始值,在不同的插值器作用下,每个单位时间内所达到的变量值不同。
下面举例子说明:
动画是放大缩小的动画,通过scale动画来控制,首先在anim里面定义动画的xml文件:
scaleanim_decelerate.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="700"
android:fillAfter="true"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.4"
android:toYScale="1.4" />
Animation decelerateAnim = AnimationUtils.loadAnimation(this, R.anim.scaleanim_decelerate);
tv.startAnimation(decelerateAnim);
RotateAnimation、ScaleAnimation、TranslateAnimation都存在一对pivotXType,pivotYType参数,
它们是用来指定点的参照类型,使用int类型以静态常量的形式定义在Animation中。
ABSOLUTE:以绝对坐标为参照。
RELATIVE_TO_PARENT:以父容器为参照。
RELATIVE_TO_SELF:以当前容器为参照。
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
自定义动画:
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation; class ViewAnimation extends Animation {
int mCenterX;
int mCenterY;
Camera camera = new Camera(); public ViewAnimation() {
} //初始化操作
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight); mCenterX = width / 2; mCenterY = height / 2;
//设置时间长短
setDuration(2500);
//动画结束后保持状态
setFillAfter(true);
//设置插值器 ,线性均匀改变
setInterpolator(new LinearInterpolator());
} //定义动画的进行过程
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final Matrix matrix = t.getMatrix(); camera.save();
//设置移动
camera.translate(0.0f, 0.0f, (1300 - (1300.0f * interpolatedTime)));
//设置旋转角度
camera.rotateY(360 * interpolatedTime);
//将变换作用于matrik上
camera.getMatrix(matrix);
//矩阵作用前的偏移量
matrix.preTranslate(-mCenterX, -mCenterY); matrix.postTranslate(mCenterX, mCenterY); camera.restore();
}
}
使用:
初始化animation:
ViewAnimation viewAnimation = new ViewAnimation();
触发事件中进行调用:
tv.startAnimation(viewAnimation);
rotateX(float degree) 绕着x轴旋转degree个度数
rotateY(float degree) 绕着y轴旋转degree个度数
rotateZ(float degree) 绕着z轴旋转degree个度数
translate(float x,float y,float z) 平移一段距离
save()保存原状态
restore() 操作完之后,恢复到原状态。
android 属性动画的更多相关文章
- Android属性动画
这几天看郭神的博客 Android属性动画完全解析(上),初识属性动画的基本用法之后,我自己突然想实现一种动画功能,就是我们在携程网.阿里旅行等等手机APP端买火车票的时候,看到有选择城市,那么就有出 ...
- 【转】android 属性动画之 ObjectAnimator
原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里 ...
- Android属性动画之ValueAnimation
ValueAnimation是ObjectAnimation类的父类,经过前几天的介绍,相信大家对ObjectAnimation有了 一定的认识,今天就为大家最后介绍一下ValueAnimation, ...
- Android属性动画完全解析(下)
转载:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了 ...
- Android属性动画完全解析(上),初识属性动画的基本用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...
- Android属性动画完全解析(中)
转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是 ...
- Android属性动画完全解析(上)
Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...
- Android 属性动画(Property Animation) 全然解析 (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...
- Android 属性动画 源码解析 深入了解其内部实现
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42056859,本文出自:[张鸿洋的博客] 我参加了博客之星评选,如果你喜欢我的博 ...
- 用Android属性动画实现和演示迪士尼动画基本原则
本文将介绍在Android平台上实现和演示迪士尼动画基本准则. 项目开源,GitHub: https://github.com/vhow/animation 说明: 演示动画原则的想法源自 Anima ...
随机推荐
- 移动互联网app
移动互联网app 2 App测试点 2.1安全测试 2.1.1软件权限 1隐私泄露风险:包括访问手机信息.访问联系人信息等 2对App的输入有效性校验.认证.授权.敏感数据存储.数据加密等方面进行检测 ...
- pageoffice razor pageofficelink方式调用js实现操作文档
用官方的开发者帮助文档即可,在后台实例化时一定要将pageofficecontrol控件的id属性定义,然后在前台通过定义的id属性来调用相应的方法
- Maven项目下WEB-INFO目录下没有编译的classes文件
建立mavan项目之后,在项目目录中没有发现编译的classes文件夹 解决办法: 因为maven是默认将编译后的classes文件存入项目下的target文件夹中,所以我们需要修改编译后存放的路径, ...
- React学习笔记-04 props
props实现从父组件与子组件的通信. 可以通过getDefaultProps初始化props. React 提供了propsTypes来验证props的类型 官方API: propTypes:fun ...
- 使用SQL Server视图的优缺点
SQL Server视图我们经常会用的到,下面就为您介绍使用SQL Server视图的优缺点,希望可以对您SQL Server视图有更多的了解. 在程序设计的时候必须先了解视图的优缺点,这样可以扬长避 ...
- Hdu 3363 Ice-sugar Gourd(对称,圆)
Ice-sugar Gourd Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- hexo常用命令笔记
hexo npm install -g hexo npm update -g hexo hexo init 常用 hexo n == hexo new "a new post" 新 ...
- eclipse设置JSP的默认编码
有时候我们新建一个JSP页面,但是编码却不是我们想要的,我们可在eclipse里面进行如下设置: 点击eclipse上面的window-->preferences 输入查找jsp-->点击 ...
- Android之ListView异步加载图片且仅显示可见子项中的图片
折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...
- 《JavaScript网页特效经典300例-高级篇》
<Javascript网页经典特性300例> 高级篇 第18章:ajax应用 Ajax传输JSON数据实例定义一套自己的Ajax框架 第19章:面向对象的特性 定义一个类利用prototy ...