设置旋转动画(ObjectAnimator)的Pivot,不工作?

时间:2014-02-28 18:01:33

标签: android android-animation objectanimator

我使用ObjectAnimator将旋转动画应用于按钮,而旋转似乎有效;枢轴点仍然是按钮的左上角。

MainActivity

Button bt1;

float pivotX=0f;
float pivotY=0f;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bt1 = (Button) findViewById(R.id.button1);

    pivotX = bt1.getX() + (float)bt1.getWidth();// 500;// bt1.getHeight() ;
    pivotY = bt1.getY() + (float)bt1.getHeight();// 500;// bt1.getWidth(); 

    bt1.setPivotX(pivotX);
    bt1.setPivotY(pivotY);

    bt1.setOnClickListener(this);
}


private void rotate()
{
    ObjectAnimator rotate = ObjectAnimator.ofFloat(bt1, View.ROTATION_X,360);
    rotate.setDuration(2000);

    AnimatorSet aSet = new AnimatorSet();
    aSet.play(rotate);
    aSet.start();
}

@Override
public void onClick(View v) 
{
    switch(v.getId())
    {
    case R.id.button1:
        rotate();
        break;

    }
}

编辑: bt1.getX和bt1.getY返回0.一旦我知道原因就会更新。

编辑:这似乎也不起作用。

@Override
 public void onWindowFocusChanged(boolean hasFocus) 
{
  // TODO Auto-generated method stub
  super.onWindowFocusChanged(hasFocus);
  //Here you can get the size!

    width = bt1.getWidth();
    height = bt1.getHeight();

}

2 个答案:

答案 0 :(得分:0)

bt1.getWidth()无法获得结果,但onCreate中的结果为0,因为bt1尚未衡量。您可以尝试按照以下方式进行操作:

button.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout(){
    //here you can get size
    width = button.getWidth();
    height = button.getHeight();
  }
});

答案 1 :(得分:-2)

OnCreate中的

getX()总是给你一个零 - 它不是"实现"在视图

你必须等待它。我使用这个循环来等待绝对非零的值:

    new Thread(new Runnable() {
        public void run() {
            int count = 0;
            do {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "checkin... count="+count);
                count++;
            } while (!(playStopButton.getWidth() > 0) && count < 100);
            runOnUiThread(new Runnable() {
                public void run() {
                   //here get X, get width etc
                }
            });
        }
    }).start();