Android属性动画
来源:互联网 发布:机器人的编程语言 编辑:程序博客网 时间:2024/06/17 18:05
一、ObjectAnimation
定义:ObjectAnimation是在动画执行的过程中通过不断更改设置View的属性值来实现动画的效果,所以要保证对应的属性之一定要有getter和setter方法,否则不会有动画效果。
Translate动画:
//小球从右边窗口移动到左边窗口在回到原点 private void translate(){ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0); objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒 objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行 objectAnimator.start(); }
注意:动画设置的属性值以小球中点为为原点。X轴上右边为正,左边为负;Y轴上上边为负,下边为正。
Scale动画:
//将小球缩小到1/2,再放大到2倍,再还原 private void scale(){ //通过PropertyValueHolder方式 PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX",1.0f,0.5f,2.0f,1.0f); PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1.0f,0.5f,2.0f,1.0f); ObjectAnimator.ofPropertyValuesHolder(ball,scaleX,scaleY).setDuration(2000).start(); //通过AnimatorSet方式// ObjectAnimator scaleX=ObjectAnimator.ofFloat(ball,"scaleX",1.0f,0.5f,2.0f,1.0f);// ObjectAnimator scaleY=ObjectAnimator.ofFloat(ball,"scaleY",1.0f,0.6f,2.0f,1.0f);// AnimatorSet animatorSet=new AnimatorSet();// animatorSet.setDuration(2000);// animatorSet.setInterpolator(new LinearInterpolator());// animatorSet.playTogether(scaleX,scaleY);// animatorSet.start(); }
Alpha动画:
//使球先淡出在淡入 private void alpha(){ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"alpha",1.0f,0.0f,1.0f); objectAnimator.setDuration(2000); objectAnimator.setInterpolator(new LinearInterpolator()); objectAnimator.start(); }
Rotate动画:
//使小球翻转一周 private void rotateX(){ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"rotationX",0.0f,360f); objectAnimator.setDuration(3000); objectAnimator.setInterpolator(new LinearInterpolator()); objectAnimator.start(); }
二、ValueAnimator
定义:ValueAnimator通过监听动画改变的值,手动设置View的属性产生动画效果。
//ValueAnimator动画 private void valueAnimator(){ ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,ScreenUtil.getSreenWidth(this)/2); valueAnimator.setDuration(2000); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { float value= (float) valueAnimator.getAnimatedValue(); ball.setTranslationX(value); ball.setTranslationY(value); } }); valueAnimator.start(); }
三、自定义TypeEvaluator
通过自定义实体类记录动画变化的值,然后在监听里获得动画变化的值,改变View的属性。
自定义实体类:
package com.gyg.animation;/** * Created by gyg on 2017/3/5. */public class AnimatorEntity { private float x; private float y; public AnimatorEntity() { } public AnimatorEntity(float x, float y) { this.x = x; this.y = y; } public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; }}
//自定义TypeEvaluator private void customEvaluator(){ ValueAnimator valueAnimator=new ValueAnimator(); valueAnimator.setDuration(2000); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setObjectValues(new AnimatorEntity(0,0)); valueAnimator.setEvaluator(new TypeEvaluator<AnimatorEntity>() { @Override public AnimatorEntity evaluate(float fraction, AnimatorEntity animatorEntity, AnimatorEntity t1) { AnimatorEntity entity=new AnimatorEntity(); entity.setX(200 * fraction * 3); entity.setY(0.5f * 200 * (fraction * 3) * (fraction * 3)); return entity; } }); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { AnimatorEntity entity= (AnimatorEntity) valueAnimator.getAnimatedValue(); ball.setX(entity.getX()); ball.setY(entity.getY()); } }); valueAnimator.start(); }
四、给动画设置监听
//给动画设置监听 private void AnimatorListener(){ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0); objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒 objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行 objectAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) {//动画开始时执行 Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT); } @Override public void onAnimationEnd(Animator animator) {//动画结束时执行 Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT); } @Override public void onAnimationCancel(Animator animator) {//动画取消时执行 Toast.makeText(MainActivity.this,"onAnimationV",Toast.LENGTH_SHORT); } @Override public void onAnimationRepeat(Animator animator) {//动画重复时执行 Toast.makeText(MainActivity.this,"onAnimationRepeat",Toast.LENGTH_SHORT); } }); objectAnimator.start(); }
还有一种简单的适配器AnimatorListenerAdapter,可以根据需要重写里面的方法。比如我只想监听动画开始和结束:
//给动画设置监听 private void AnimatorListenerSimple(){ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0); objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒 objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行 objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animator) {//动画开始时执行 Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT); } @Override public void onAnimationEnd(Animator animator) {//动画结束时执行 Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT); } }); objectAnimator.start(); }
五、Xml方式设置动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together" ><!--togerther表示一起执行 sequentially表示按照先后顺序依次执行--> <!--x轴方向缩小0.5倍--> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1" android:valueTo="0.5" > </objectAnimator> <!--y轴方向缩小0.5倍--> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1" android:valueTo="0.5" > </objectAnimator></set>
//xml方式定义动画 private void AnimationXml(){ Animator animator= AnimatorInflater.loadAnimator(this,R.animator.anim_scale); animator.setInterpolator(new LinearInterpolator()); animator.setDuration(1000); animator.setTarget(image); image.setPivotX(0); image.setPivotY(0); image.invalidate();//通过设置pivotX,pivotY使image以左上角为中心缩放 animator.start(); }
0 0
- Android动画--属性动画
- android动画 -- 属性动画
- Android动画-属性动画
- Android动画【属性动画】
- Android动画--属性动画
- android属性动画--布局动画
- Android 动画之属性动画
- Android中的动画,属性动画
- android-属性动画、视图动画
- Android动画之属性动画
- android动画 属性动画详解
- Android笔记----动画、属性动画
- Android动画之属性动画
- android 动画 之 属性动画
- Android动画之---属性动画
- Android动画之属性动画
- Android动画--属性动画--基础
- Android动画(三):属性动画
- 开源项目使用问题集锦
- 调整multiselect宽度
- java中static方法的使用问题
- Pillow学习之Image
- 参加航天科工辅导营的感想
- Android属性动画
- 微信SDK
- 支持向量机学习笔记
- Pillow学习之ImageChops
- 什么是Mixin模式:带实现的协议
- 2824: [AHOI2012]铁盘整理
- 支付宝SDK
- 

- android事件传递精华简易版