ObjectAnimator不使用作为变量传递的参数

时间:2016-02-16 11:10:43

标签: android objectanimator

我的情况是我使用ObjectAnimator类为ImageView设置动画效果。我通过视图的height属性沿Y轴平移ImageView。我将其height属性存储在名为" menuHeight"的变量中。当我使用此变量(menuHeight * -1)向上翻译视图时,它可以正常工作。当我尝试使用相同的变量向后翻译它(减去将其转换为负数)时,它并没有做任何事情。如果我对高度值进行硬编码(在本例中为659),则可以正常工作。

代码:

public class MainActivity extends AppCompatActivity {

    ImageView menu;
    Button slideUpButton;
    Button slideDownButton;
    float 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);

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

       menu.setBackgroundResource(R.drawable.menucropped);

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

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


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

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

    }
    @Override
    public void onWindowFocusChanged(boolean hasFocus){
        menuHeight=menu.getHeight();
        menu.setTranslationY(menuHeight);
    }

}

所以,长话短说,这不起作用:

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

但这样做:

final ObjectAnimator slideDownTranslate = ObjectAnimator.ofFloat(menu,View.TRANSLATION_Y, 659);

这也是如此:

final ObjectAnimator slideUpTranslate = ObjectAnimator.ofFloat(menu,View.TRANSLATION_Y, menuHeight * -1);

我已通过日志确认变量在使用高度值初始化后的任何时刻都没有变化。为什么将翻译值作为变量传递到一个而不是另一个?我错过了一些简单的东西吗?

1 个答案:

答案 0 :(得分:0)

你从未初始化

float menuHeight; 

这段代码如何不在IDE中引发任何错误标志? 很多新设备都可以显示多个窗口,因此可能不会调用onWindowFocusChanged(),因此不会初始化menuHeight变量。