属性动画
来源:互联网 发布:真丝睡衣 知乎 编辑:程序博客网 时间:2024/05/29 07:04
//属性动画的平移,渐变,缩放,旋转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; } }}
阅读全文
0 0
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 属性动画
- 你在开发中遇到过哪些坑?【不断更新中】
- Older Brother(分解质因数)
- 一起来学习VUE
- 如何将结合了 Firebase 的 AdMob 添加到新建的 Cocos2d-x 项目
- 51nod 1290 Counting Diff Pairs(莫队+树状数组)
- 属性动画
- 图像拼接(Image Stitching)问题的研究史
- 【网安随笔】ctf-word隐写
- alpine linux填坑之路(一)
- 算法——硬币选择问题(dp、贪心)
- WebSockte
- 神经网络相关名词解释
- 51nod 1678 lyk与gcd mobius反演
- 选择排序