Android view.setX()/ setY()根据加速度计的变化,显示运动轨迹动画

时间:2016-09-14 21:22:29

标签: android view android-animation

我正在尝试实施类似的事项:
动作线索动画
运动模糊动画
鬼动画
(我不知道“效果”的正确名称)反复改变视图位置。

功能,根据加速度计的变化重复调用:

public void setXY(float x, float y) {
    if(view != null) {
        overloadPoint.setX(pointX);
        overloadPoint.setY(pointY);
    }
}

我的目标:
对于更改X,Y动画显示旧视图位置和新视图位置之间的路径(线,曲线)。

或替代目标:
在新旧视图位置之间,我想冻结旧位置并应用例如alpha效果在旧位置查看从1.0f到0.0f,持续时间:100ms。因此,当每隔50ms调用一次方法时,我会看到两个视图。两个视图都会有淡出效果(alpha 1.0f - > 0.0f),但是较旧的将具有较少的alpha。

对于:API> = 21

我试过了:

public void setXY(float x, float y){
    final View view = new View(this);
    view.setLayoutParams(new LinearLayout.LayoutParams(
            25, //TODO
            25)); //TODO
    view.setBackgroundResource(R.drawable.background_point);
    relativeLayout.addView(view);
    view.setX(x);
    view.setY(y);

    //Variant 1:
    view.animate()
            .alpha(0f)
            .setDuration(750)
            .setInterpolator(new DecelerateInterpolator())
            .withLayer()
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    relativeLayout.removeView(view);
                }
            })
            .start();

    //Variant 2:
    /*AlphaAnimation anim1 = new AlphaAnimation(1f, 0f);
    anim1.setDuration(750);
    //anim1.setFillAfter(true);
    anim1.setAnimationListener(new Animation.AnimationListener() {
        public void onAnimationStart(Animation anim) {};
        public void onAnimationRepeat(Animation anim){};
        public void onAnimationEnd(Animation anim) {
            relativeLayout.removeView(view);
        };
    });
    view.startAnimation(anim1);*/

    //Variant 3:
    /*view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.ALPHA, 0f);
    // Add a listener that does cleanup
    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            relativeLayout.removeView(view);
            view.setLayerType(View.LAYER_TYPE_NONE, null);
        }
    });
    animator.start();*/
}

但我认为,这些都不是好的解决方案..反复创建和删除视图。用一个视图效果会更好。

谢谢。

0 个答案:

没有答案