android:自定义循环移动的View

最近,项目需求中有一个循环左右移动的View,从中间移动到最左边,然后又移动到最右边,如此来回循环。
效果图如下:


循环移动.gif

其中LoopAnim 是控件循环移动的动画。
核心代码:


import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.DecelerateInterpolator;


public class LoopAnim {

    /**
     * 对外调用的方法
     *
     * @param moveView     移动的View
     * @param moveZoneView 移动区域
     */
    public static void startAnim(View moveView, View moveZoneView) {
        int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        moveZoneView.measure(w, h);
        int height = moveZoneView.getMeasuredHeight();
        int width = moveZoneView.getMeasuredWidth();
        LoopAnim.addAnim(moveView, width);
    }

    /**
     * 定义动画
     *
     * @param view  view对象
     * @param width 移动的区域的宽度
     *              动画流程   首先从中间开始往左边移动对应的距离
     *              

* 再移动到最右边,再移动到最左边,然后反复执行此方法 */ private static void addAnim(final View view, final int width) { ObjectAnimator statrRight = ObjectAnimator.ofFloat(view, "translationX", 0F, -(width)); // statrRight.setInterpolator(new Inte));//设置动画插入器,减速,默认是先加速再减速,符合要求 statrRight.setDuration(4000); statrRight.start(); statrRight.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); loop(view, width); } }); } private static void loop(final View view, final int width) { ObjectAnimator loopRight = ObjectAnimator.ofFloat(view, "translationX", -(width), width); // loopRight.setInterpolator(new DecelerateInterpolator(2.0f));//设置动画插入器,减速 loopRight.setDuration(8000); loopRight.start(); loopRight.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); ObjectAnimator loopLeft = ObjectAnimator.ofFloat(view, "translationX", width, -(width)); // loopLeft.setInterpolator(new DecelerateInterpolator(1.0f));//设置动画插入器,减速 loopLeft.setDuration(8000); loopLeft.start(); loopLeft.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); loop(view, width); } }); } }); } }

接下来,调用就很简单了,一句代码就OK。

LoopAnim.startAnim(moveView, moveZoneView);

其中 moveView 是指移动的 View
moveZoneView 是指 View移动的区域

搞定。


你可能感兴趣的:(android:自定义循环移动的View)