Android实现气泡漂浮动画,类似IOS Game Center中气泡动画

原创
2016/01/07 20:08
阅读数 761

网上没找到,于是自己写了一个,简单的算法,利用 PropertyValuesHolder实现多个动画的集合,不多说,直接上代码吧,非常好理解:

/**
     * 气泡漂浮动画
     * @param view
     * @param duration  动画运行时间
     * @param offset    动画运行幅度
     * @param repeatCount   动画运行次数
     * @return
     */
    public static ObjectAnimator bubbleFloat(View view, int duration, int offset, int repeatCount) {
        float path = (float) (Math.sqrt(3)/2*offset);
        PropertyValuesHolder translateX = PropertyValuesHolder.ofKeyframe(View.TRANSLATION_X,
                Keyframe.ofFloat(0f, 0),
                Keyframe.ofFloat(1/12f, offset / 2),
                Keyframe.ofFloat(2/12f, path),
                Keyframe.ofFloat(3/12f, offset),
                Keyframe.ofFloat(4/12f, path),
                Keyframe.ofFloat(5/12f, offset / 2),
                Keyframe.ofFloat(6/12f, 0),
                Keyframe.ofFloat(7/12f, -offset / 2),
                Keyframe.ofFloat(8/12f, -path),
                Keyframe.ofFloat(9/12f, -offset),
                Keyframe.ofFloat(10/12f, -path),
                Keyframe.ofFloat(11/12f, -offset/2),
                Keyframe.ofFloat(1f, 0)
        );

        PropertyValuesHolder translateY = PropertyValuesHolder.ofKeyframe(View.TRANSLATION_Y,
                Keyframe.ofFloat(0f, 0),
                Keyframe.ofFloat(1/12f, offset-path),
                Keyframe.ofFloat(2/12f, offset/2),
                Keyframe.ofFloat(3/12f, offset),
                Keyframe.ofFloat(4/12f, offset*3/2),
                Keyframe.ofFloat(5/12f, offset+path),
                Keyframe.ofFloat(6/12f, offset*2),
                Keyframe.ofFloat(7/12f, offset+path),
                Keyframe.ofFloat(8/12f, offset*3/2),
                Keyframe.ofFloat(9/12f, offset),
                Keyframe.ofFloat(10/12f, offset/2),
                Keyframe.ofFloat(11/12f, offset-path),
                Keyframe.ofFloat(1f, 0)
        );

        PropertyValuesHolder rotateX = PropertyValuesHolder.ofKeyframe(View.ROTATION_X,
                Keyframe.ofFloat(0f, 0),
                Keyframe.ofFloat(1/12f, offset / 2),
                Keyframe.ofFloat(2/12f, path),
                Keyframe.ofFloat(3/12f, offset),
                Keyframe.ofFloat(4/12f, path),
                Keyframe.ofFloat(5/12f, offset / 2),
                Keyframe.ofFloat(6/12f, 0),
                Keyframe.ofFloat(7/12f, -offset / 2),
                Keyframe.ofFloat(8/12f, -path),
                Keyframe.ofFloat(9/12f, -offset),
                Keyframe.ofFloat(10/12f, -path),
                Keyframe.ofFloat(11/12f, -offset/2),
                Keyframe.ofFloat(1f, 0)
        );

        PropertyValuesHolder rotateY = PropertyValuesHolder.ofKeyframe(View.ROTATION_Y,
                Keyframe.ofFloat(0f, 0),
                Keyframe.ofFloat(1/12f, offset / 2),
                Keyframe.ofFloat(2/12f, path),
                Keyframe.ofFloat(3/12f, offset),
                Keyframe.ofFloat(4/12f, path),
                Keyframe.ofFloat(5/12f, offset / 2),
                Keyframe.ofFloat(6/12f, 0),
                Keyframe.ofFloat(7/12f, -offset / 2),
                Keyframe.ofFloat(8/12f, -path),
                Keyframe.ofFloat(9/12f, -offset),
                Keyframe.ofFloat(10/12f, -path),
                Keyframe.ofFloat(11/12f, -offset/2),
                Keyframe.ofFloat(1f, 0)
        );

        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, translateX, translateY, rotateX, rotateY).
                setDuration(duration);
        animator.setRepeatCount(repeatCount);
        animator.setInterpolator(new LinearInterpolator());
        return animator;
    }

使用方法:

bubbleFloat(view, 3000, 10, -1);


Have a nice day!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部