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 移动的区域的宽度
     *              动画流程   首先从中间开始往左边移动对应的距离
     *              <p>
     *              再移动到最右边,再移动到最左边,然后反复执行此方法
     */
    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的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,990评论 25 708
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,003评论 3 119
  • 我想成为一棵无用的树 作者:笑巫 我想成为一棵无用的树在山岗在沙漠在原野 我想孤零零地立在那里一万年 我想成为一棵...
    笑巫阿姨阅读 565评论 2 5
  • 吃下影评人的安利。我在今天看完了获得奥斯卡奖的电影,聚焦(SpotLight)。 这部电影的大概就是某报社里的聚焦...
    Sumiu_阅读 507评论 1 1
  • (保护环境,人人有责。这是个关于一张擦拭汗水的面纸的故事,呼吁不要乱扔垃圾!) 耀眼的太阳光芒,透过指尖的缝隙,试...
    正晓孩阅读 1,200评论 9 42