view动画
1.透明度动画
//float fromAlpha, float toAlpha
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
view.startAnimation(aa);
2.旋转动画
//float fromDegrees, float toDegrees, float pivotX, float pivotY pivot为相对view左上角旋转的坐标
RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
ra.setDuration(1000);
view.startAnimation(ra);
//相对于自己旋转
//float fromDegrees, float toDegrees, int pivotXType,float pivotXValue,int pivotYType, float pivotYValue
RotateAnimation ra = new RotateAnimation(0, 360,
RotateAnimation.RELATIVE_TO_SELF, 0.5F,
RotateAnimation.RELATIVE_TO_SELF, 0.5F);
ra.setDuration(1000);
view.startAnimation(ra);
3.位移动画
//float fromXDelta, float toXDelta, float fromYDelta, float toYDelta
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);
ta.setDuration(1000);
view.startAnimation(ta);
4.缩放动画
//float fromX, float toX, float fromY, float toY 从0到自己的两倍大小。以左上角为基点。
ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);
sa.setDuration(1000);
view.startAnimation(sa);
//以中心为基点缩放
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1,
Animation.RELATIVE_TO_SELF, 0.5F,
Animation.RELATIVE_TO_SELF, 0.5F);
sa.setDuration(1000);
view.startAnimation(sa);
5.动画集合和监听
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
ta.setDuration(1000);
as.addAnimation(ta);
view.startAnimation(as);
as.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
属性动画
基本api
ObjectAnimator ob = ObjectAnimator.ofFloat(object,"translationX",300);
ob.setDuration(2000);
ob.start();
属性有:translationX/Y 从view布局容器左上角坐标偏移位置
rotation rotationX/y 三个属性控制view对象围绕他的支点进行2D 3D旋转
scaleX/Y 控制的是围绕着支点的缩放
pivotX/y 控制View对象的支点 默认是中心点
x,y View 对象在容器中的最终位置,是最初左上角坐标和translationX/Y的值累计和
alpha 透明度,1 不透明 0完全透明
自定义属性动画 提供seter/getter即可
private static class WrapperView {
private View mTarget;
public WrapperView(View target) {
mTarget = target;
}
public int getWidth() {
return mTarget.getLayoutParams().width;
}
public void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
//使用
WrapperView vi = new WrapperView(alpha);
ObjectAnimator.ofInt(vi,"width",500).setDuration(2000).start();
多个属性同时使用的api propertValuesHolder
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX",300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY",1f,0,1f); ObjectAnimator.ofPropertyValuesHolder(alpha,pvh1,pvh2,pvh3).setDuration(2000).start();
属性动画的核心 ValueAnimator
ValueAnimator va = ValueAnimator.ofFloat(0,100);
va.setTarget(value);
va.setDuration(2000).start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float values = (float) animation.getAnimatedValue();
Log.i("数值",values+"");
}
});
属性动画的监听
ob.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
//简单实现
va.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
更好的set集合动画控制
其他方法 playTogether(),playSequentially(),animSet.play().width()、before()、after()
ObjectAnimator animator1 = ObjectAnimator.ofFloat(alpha, "translationX", 300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(alpha, "scaleX", 1f, 0, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(alpha, "scaleY", 1f, 0, 1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(2000);
set.playTogether(animator1,animator2,animator3);
set.start();
xml使用属性动画
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType">
</objectAnimator>
private void scaleX(View v){
Animator anim = AnimatorInflater
.loadAnimator(this,R.animator.animator);
anim.setTarget(v);
anim.start();
}
View的animate方法
animate.animate().alpha(0).y(300).setDuration(2000).withStartAction(new Runnable() {
@Override
public void run() {
}
}).withEndAction(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
}).start();
android布局动画 即addView时的动画 默认的是
android:animateLayoutChanges="true"//不可自定义 逐渐显示的过渡动画
自定义
ll = (LinearLayout) findViewById(R.id.ll);
//设置过渡动画
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setDuration(2000);
LayoutAnimationController lc = new LayoutAnimationController(sa, 0.5f);
lc.setOrder(LayoutAnimationController.ORDER_NORMAL);
//设置布局动画
ll.setLayoutAnimation(lc);
LayoutAnimationController.ORDER_NORMAL 顺序
LayoutAnimationController.ORDER_RANDOM 随机
LayoutAnimationController.ORDER_REVEESE 反序
自定义动画
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
Matrix matrix = t.getMatrix();
xxxxxxx
}
电视机关闭效果
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
matrix.preScale(1, 1 - interpolatedTime, width,height);
super.applyTransformation(interpolatedTime, t);
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
setDuration(2000);
setFillAfter(true);
setInterpolator(new BounceInterpolator());
w = width / 2;
h = height / 2;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
// matrix.preScale(1, 1 - interpolatedTime, w,h);
mCamera.save();
//设置旋转角度
mCamera.rotate(0, 180, 360);
mCamera.restore();
//通过pre方法设置矩形作用前的偏移量来改变旋转中心
matrix.preTranslate(w, h);
matrix.postTranslate(-w, -h);
super.applyTransformation(interpolatedTime, t);
}