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

android动画

2015-11-16 12:05 459 查看
 Animation: 不管怎么变换,只有原始位置会响应事件,新位置不会响应事件

         *

属性动画: 变换后的位置可以响应事件,原来的位置不再响应事件

//自定义Animtion
MyAnimation animation=new MyAnimation();
v.startAnimation(animation);
package com.example.androidtest;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.ScaleAnimation;
import android.view.animation.Transformation;

public class MyAnimation extends Animation {

private int centerX;
private int centerY;
//用来修改动画变换矩阵
private Camera camera;

private final int  rotateY=300;

//可以在这初始化
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
// TODO Auto-generated method stub
super.initialize(width, height, parentWidth, parentHeight);

setDuration(3000);

setFillAfter(true);

setInterpolator(new LinearInterpolator());

centerX=parentWidth/2;

centerY=parentHeight/2;

camera=new Camera();
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// TODO Auto-generated method stub
Matrix matrix=t.getMatrix();

camera.save();

camera.rotateY(interpolatedTime*rotateY);
//把旋转变换作用到矩阵上
camera.getMatrix(matrix);

camera.restore();

//下面两行代码改变旋转时的默认旋转中心
matrix.preTranslate(centerX, centerY);
matrix.postTranslate(-centerX, -centerY);

}

}


CircleView civ=(CircleView) findViewById(R.id.civ);
//属性动画方式1
PropertyValuesHolder pvh1=PropertyValuesHolder.ofFloat("translationX", 300);
PropertyValuesHolder pvh2=PropertyValuesHolder.ofFloat("scaleX", 1,0,1f);
PropertyValuesHolder pvh3=PropertyValuesHolder.ofFloat("scaleY", 1,0,1);

final ObjectAnimator anim=ObjectAnimator.ofPropertyValuesHolder(civ, pvh1,pvh2,pvh3);
anim.setDuration(3000).start();

anim.addListener(new AnimatorListenerAdapter() {

@Override
public void onAnimationEnd(Animator animation) {

}

});
//
//属性动画方式2
CircleView civ2=(CircleView) findViewById(R.id.civ2);
// 3.0之后才有animate()方法
civ2.animate().alpha(0.5f).rotationY(360).translationX(100)
.setDuration(3000).scaleX(0.5f).scaleY(0.5f)
.withEndAction(new Runnable() {

@Override
public void run() {

}
}).start();

/*
* 布局动画
*
* 在给ViewGroup中addView时添加的一个动画过度效果(每一个子控件都会执行,可以选择执行顺序)。
* 最简单的方式是在布局文件中的父布局中添加如下代码
* android:animateLayoutChanges="true"
* 不过这种方式是安卓默认的效果,无法改变
*
* 可以通过如下方式来改变效果
*/
final ViewGroup viewGroup=(ViewGroup) findViewById(R.id.container);
ScaleAnimation sa=new ScaleAnimation(0, 1, 0, 1); //x方向从0到1 y方向从0到1
sa.setDuration(5000);

//0.5 每个子控件执行动画的延时
final LayoutAnimationController lac=new LayoutAnimationController(sa,0.5f);
/*
* LayoutAnimationController.ORDER_NORMAL 顺序执行
* LayoutAnimationController.ORDER_RANDOM 随机执行
* LayoutAnimationController.ORDER_REVERSE 反序执行
*
*/
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);

//调用该方法后会执行动画(每个子控件都会执行)
viewGroup.setLayoutAnimation(lac);

civ.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
ImageView child=new ImageView(getApplicationContext());
child.setImageResource(R.drawable.pic);
// TODO Auto-generated method stub
viewGroup.addView(child);
//
viewGroup.setLayoutAnimation(lac);

}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android