方法适用于文字值,但不适用于保持相同值的变量

时间:2016-02-19 07:03:14

标签: java android

以下代码。

ObjectAnimator对象“ slideUpTranslate ”工作得很好。它向上滑动ImageView。

然而,

slideDownTranslate 根本不起作用,除非提供了文字值来代替整数变量“menuHeight”。它不会抛出任何类型的错误,当你按下滑动按钮时它什么都不做。

我尝试在onCreate调用中手动将menuHeight初始化为任意值。我已经尝试将其指定为浮点而不是整数。我已经尝试为每个ObjectAnimator对象使用不同的变量。我尝试使用与slideUpTranslate完全相同的参数来实例化slideDownTranslate。没有雪茄。我真的没有看到为什么slideDownTranslate不起作用的原因。

    Button slideUpButton;
    Button slideDownButton;
    ImageView menuView;
    int menuHeight;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        slideUpButton = (Button)findViewById(R.id.slideUpButton);
        slideDownButton = (Button)findViewById(R.id.slideDownButton);
        menuView = (ImageView)findViewById(R.id.menuView);

        menuView.setBackgroundResource(R.drawable.menucropped);

        //This works
        final ObjectAnimator slideUpTranslate = 
ObjectAnimator.ofFloat(menuView,View.TRANSLATION_Y, menuHeight * -1);
        slideUpTranslate.setInterpolator(new AccelerateDecelerateInterpolator());

        //This does nothing
        final ObjectAnimator slideDownTranslate = 
ObjectAnimator.ofFloat(menuView,View.TRANSLATION_Y, menuHeight);
        slideDownTranslate.setInterpolator(new AccelerateDecelerateInterpolator());


        menuView.post(new Runnable() {
            @Override
            public void run() {
               menuHeight = menuView.getHeight();
                menuView.setTranslationY(menuHeight);
            }
        });

        slideUpButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                slideUpTranslate.start();
                Log.i("Test", "Slide up clicked...  Height:" + Integer.toString(menuHeight));
            }
        });

        slideDownButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                slideDownTranslate.start();
                Log.i("Test", "Slide down clicked...  Height:" + Integer.toString(menuHeight));
            }
        });

    }
}

简而言之,这有效:

final ObjectAnimator slideDownTranslate = 
ObjectAnimator.ofFloat(menuView,View.TRANSLATION_Y, 500);

但这不是:

final ObjectAnimator slideDownTranslate = 
ObjectAnimator.ofFloat(menuView,View.TRANSLATION_Y, menuHeight);

为了使事情更复杂, slideUpTranslate 可以使用文字值变量。它们完全相同,但在第三个参数槽中使用变量,而第一个参数槽中没有。

如果我不能很快解决这个问题,那就去坚果屋吧!救救我!

1 个答案:

答案 0 :(得分:1)

在首次用于创建动画之后,您将分配menuView 的值。除非我无法看到menuItem的隐藏分配,否则您将(menuHeight == 0)的值传递给两个动画师。然后,当您稍后在onclick处理程序中记录menuHeight的值时,您将看到稍后执行的Runnable中menuHeight的重新分配值。

您可能需要考虑在动画师开始之前的最后一刻分配动画师,而不是在onCreate()中初始化动画师。