Установить Pivot для анимации вращения (ObjectAnimator), не работает?

Я применил анимацию поворота к кнопке с помощью ObjectAnimator, пока поворот работает; точка поворота по-прежнему остается в верхнем левом углу кнопки.

Основное действие

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();

}

person Zen    schedule 28.02.2014    source источник
comment
ты понял это? и где вы хотите, чтобы точка опоры была? если это центр, я думаю, все, что вам нужно сделать, это разделить существующие значения поворота на два, и это должно центрировать его.   -  person wkhatch    schedule 28.04.2014


Ответы (2)


да bt1.getWidth() не может получить результат, кроме 0 в onCreate, потому что bt1 еще не было измерено. Вы можете попробовать следующее:

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

getX() в OnCreate всегда дает вам ноль - он не «реализован» при просмотре

вы должны ждать его. Я использую этот цикл для ожидания определенно ненулевых значений:

    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();
person djdance    schedule 31.08.2014