//属性动画的平移,渐变,缩放,旋转
import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/**
* 开启动画
*/
private Button mBtStart;
/**
* Hello World!
*/
private TextView mTv;
/**
* 停止
*/
private Button mBtStop;
private ValueAnimator valueAnimator;
/**
* 取消监听
*/
private Button mBtCancleListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBtStart = (Button) findViewById(R.id.bt_start);
mBtStart.setOnClickListener(this);
mTv = (TextView) findViewById(R.id.tv);
mTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "mTv 点击了", Toast.LENGTH_SHORT).show();
}
});
mBtStop = (Button) findViewById(R.id.bt_stop);
mBtStop.setOnClickListener(this);
mBtCancleListener = (Button) findViewById(R.id.bt_cancle_listener);
mBtCancleListener.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_start:
propAnim();
// trans();
// propColor();
break;
case R.id.bt_stop:
//停止动画
if (valueAnimator != null && valueAnimator.isRunning()) {
// valueAnimator.cancel();
valueAnimator.end();
}
break;
case R.id.bt_cancle_listener:
//取消监听
valueAnimator.removeListener(animatorListener);
break;
}
}
private void trans() {
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 300, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 400);
translateAnimation.setDuration(3000);
translateAnimation.setFillAfter(true);
mTv.startAnimation(translateAnimation);
}
private void propColor() {
ValueAnimator valueAnimator = ValueAnimator.ofInt(0xffff0000, 0xff0000ff);
valueAnimator.setEvaluator(new ArgbEvaluator());
valueAnimator.setDuration(3000);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int color = (int) animation.getAnimatedValue();
mTv.setBackgroundColor(color);
}
});
valueAnimator.start();
}
private void propAnim() {
//先创建一个ValueAnimator
valueAnimator = ValueAnimator.ofInt(0, 300);
//设置动画执行时间
valueAnimator.setDuration(3000);
//设置重复次数
// valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
//设置动画重复模式
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
//设置插值器
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
//设置监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
// Log.e("MainActivity", "value:" + value);
mTv.layout(value, value, value + mTv.getWidth(), value + mTv.getHeight());
}
});
valueAnimator.addListener(animatorListener);
//开启动画
valueAnimator.start();
}
private Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.e("MainActivity", "onAnimationStart");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.e("MainActivity", "onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.e("MainActivity", "onAnimationCancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.e("MainActivity", "onAnimationRepeat");
}
};
}
//点击按钮,图片从四个方向出来
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
public class Main3Activity extends AppCompatActivity implements View.OnClickListener {
private ImageView mIvTop;
private ImageView mIvRight;
private ImageView mIvBottom;
private ImageView mIvLeft;
private ImageView mIvCircle;
private boolean flag;//false表示未显示,true表示已经显示了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
initView();
}
private void initView() {
mIvTop = (ImageView) findViewById(R.id.iv_top);
mIvRight = (ImageView) findViewById(R.id.iv_right);
mIvBottom = (ImageView) findViewById(R.id.iv_bottom);
mIvLeft = (ImageView) findViewById(R.id.iv_left);
mIvCircle = (ImageView) findViewById(R.id.iv_circle);
mIvCircle.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_circle:
if (!flag) {
//点击把所有图标都展示出来
show();
} else {
//点击把所有图标都收起来
dismiss();
}
flag = !flag;
break;
}
}
/**
* 展示图标
*/
private void show() {
ObjectAnimator tranLeft = ObjectAnimator.ofFloat(mIvLeft, "TranslationX", 0f, -100f);
ObjectAnimator tranRight = ObjectAnimator.ofFloat(mIvRight, "TranslationX", 0f, 100f);
ObjectAnimator tranTop = ObjectAnimator.ofFloat(mIvTop, "TranslationY", 0f, -100f);
ObjectAnimator tranBottom = ObjectAnimator.ofFloat(mIvBottom, "TranslationY", 0f, 100f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(tranBottom, tranLeft, tranRight, tranTop);
animatorSet.setDuration(2000);
animatorSet.start();
}
private void dismiss() {
ObjectAnimator tranLeft = ObjectAnimator.ofFloat(mIvLeft, "TranslationX", -100f, 0f);
ObjectAnimator tranRight = ObjectAnimator.ofFloat(mIvRight, "TranslationX", 100f, 0f);
ObjectAnimator tranTop = ObjectAnimator.ofFloat(mIvTop, "TranslationY", -100f, 0f);
ObjectAnimator tranBottom = ObjectAnimator.ofFloat(mIvBottom, "TranslationY", 100f, 0f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(tranBottom, tranLeft, tranRight, tranTop);
animatorSet.setDuration(2000);
animatorSet.start();
}
}
//贝塞尔曲线动画,模拟点赞
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import java.util.Random;
public class LoveLayout extends RelativeLayout {
private Drawable mRed, mYellow, mBlue;
private Drawable[] mDrawables;
private Interpolator[] mInterpolators;
private int mDrawableHeight, mDrawableWidth;
private int mWidth, mHeight;
private LayoutParams params;
private Random mRandom = new Random();
public LoveLayout(Context context) {
this(context, null);
}
public LoveLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoveLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
initDrawable();
initInterpolator();
// 初始化params
params = new LayoutParams(mDrawableWidth, mDrawableHeight);
// 父容器水平居中
params.addRule(CENTER_HORIZONTAL, TRUE);
// 父容器的底部
params.addRule(ALIGN_PARENT_BOTTOM, TRUE);
}
/**
* 初始化几种插补器
*/
private void initInterpolator() {
mInterpolators = new Interpolator[4];
mInterpolators[0] = new LinearInterpolator();// 线性
mInterpolators[1] = new AccelerateDecelerateInterpolator();// 先加速后减速
mInterpolators[2] = new AccelerateInterpolator();// 加速
mInterpolators[3] = new DecelerateInterpolator();// 减速
}
private void initDrawable() {
// mRed = getResources().getDrawable(R.drawable.pl_red);
// mYellow = getResources().getDrawable(R.drawable.pl_yellow);
// mBlue = getResources().getDrawable(R.drawable.pl_blue);
mDrawables = new Drawable[3];
mDrawables[0] = mRed;
mDrawables[1] = mYellow;
mDrawables[2] = mBlue;
// 得到图片的实际宽高
mDrawableWidth = mRed.getIntrinsicWidth();
mDrawableHeight = mRed.getIntrinsicHeight();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getMeasuredWidth();
mHeight = getMeasuredHeight();
}
/**
* 添加点赞图片
**/
public void addLove() {
final ImageView loveIv = new ImageView(getContext());
loveIv.setImageDrawable(mDrawables[mRandom.nextInt(mDrawables.length)]);
loveIv.setLayoutParams(params);
addView(loveIv);
// 最终的属性动画集合
AnimatorSet finalSet = getAnimatorSet(loveIv);
finalSet.start();
}
/**
* 构造三个属性动画
*/
private AnimatorSet getAnimatorSet(ImageView loveIv) {
// 1.alpha动画
ObjectAnimator alpha = ObjectAnimator
.ofFloat(loveIv, "alpha", 0.3f, 1f);
// 2.缩放动画
ObjectAnimator scaleX = ObjectAnimator.ofFloat(loveIv, "scaleX", 0.2f, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(loveIv, "scaleY", 0.2f, 1f);
// 刚刚进入动画集合
AnimatorSet enter = new AnimatorSet();
enter.setDuration(500);
enter.playTogether(alpha, scaleX, scaleY);
enter.setTarget(loveIv);
return enter;
}
/**
* 贝塞尔曲线动画(核心,不断的修改ImageView的坐标ponintF(x,y) )
*/
private ValueAnimator getBezierValueAnimator(final ImageView loveIv) {
// 曲线的两个顶点
// PointF pointF2 = getPonitF(2);
// PointF pointF1 = getPonitF(1);
// 起点位置
PointF pointF0 = new PointF((mWidth - mDrawableWidth) / 2, mHeight
- mDrawableHeight);
// 结束的位置
PointF pointF3 = new PointF(mRandom.nextInt(mWidth), 0);
// 估值器Evaluator,来控制view的行驶路径(不断的修改point.x,point.y)
// BezierEvaluator evaluator = new BezierEvaluator(pointF1, pointF2);
// 属性动画不仅仅改变View的属性,还可以改变自定义的属性
// ValueAnimator animator = ValueAnimator.ofObject(evaluator, pointF0,
// pointF3);
ValueAnimator animator = null;
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 不断改变ImageView的x,y的值
PointF pointF = (PointF) animation.getAnimatedValue();
loveIv.setX(pointF.x);
loveIv.setY(pointF.y);
loveIv.setAlpha(1 - animation.getAnimatedFraction() + 0.1f);// 得到百分比
}
});
animator.setTarget(loveIv);
animator.setDuration(3000);
return animator;
}
// 贝塞尔估值器
public class BezierEvaluator implements TypeEvaluator<PointF> {
private PointF point1, point2;
public BezierEvaluator(PointF pointF1, PointF pointF2) {
this.point1 = pointF1;
this.point2 = pointF2;
}
@Override
public PointF evaluate(float t, PointF point0, PointF point3) {
// t百分比, 0~1
PointF point = new PointF();
point.x = point0.x * (1 - t) * (1 - t) * (1 - t) //
+ 3 * point1.x * t * (1 - t) * (1 - t)//
+ 3 * point2.x * t * t * (1 - t)//
+ point3.x * t * t * t;//
point.y = point0.y * (1 - t) * (1 - t) * (1 - t) //
+ 3 * point1.y * t * (1 - t) * (1 - t)//
+ 3 * point2.y * t * t * (1 - t)//
+ point3.y * t * t * t;//
// 套用上面的公式把点返回
return point;
}
}
}