Ошибка при попытке создать круговое раскрытие: IllegalStateException: не удается запустить эту анимацию в отдельном представлении

Итак, я экспериментирую, пытаясь создать круговое раскрытие на уровне API 21 в TextView, но я продолжаю получать эту ошибку. Сначала я подумал, что это как-то связано с жизненным циклом фрагмента, который я пытался сделать, но тогда я просто попробовал одно и то же в действии, и он все равно не сработает.

Здесь код:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window w = getWindow();
        w.setFlags(
                WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        w.setStatusBarColor(Color.parseColor("#0277bd"));


        setContentView(R.layout.activity_main);


        TextView tv = (TextView) findViewById(R.id.text);



        int a = (tv.getLeft() + tv.getRight()) / 2;
        int b = (tv.getTop() + tv.getBottom()) / 2;

        int radius = tv.getWidth();

        Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);

        anim.start();





    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        return super.onCreateOptionsMenu(menu);
    }
}

Это еще ранние дни, поэтому я не могу найти ответы на это. Любые идеи?

Ответ 1

Вы получаете ошибку, потому что просматриваемый вами просмотр еще не был измерен и выложен на экране. ViewAnimationUtils.createCircularReveal требуется, чтобы целевой вид измерялся для вычисления анимации. Вы также обнаружите, что ваши переменные a и b всегда равны 0.

Если вы хотите поэкспериментировать, создайте анимацию и запустите ее в режиме прослушивания кнопки. Вот пример использования вашего кода:

Button button = (Button) findViewById(R.id.your_button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        TextView tv = (TextView) findViewById(R.id.text);

        int a = (tv.getLeft() + tv.getRight()) / 2;
        int b = (tv.getTop() + tv.getBottom()) / 2;

        int radius = tv.getWidth();

        Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);

        anim.start();
    }
});

Ответ 2

Вы можете использовать Runnable для создания анимации. Runnable будет запущен после создания представления. Нет необходимости отправлять оповещения.

view.post(new Runnable()
{ 
       @Override 
       public void run(){ 
           //create your anim here
       } 
});

Ответ 3

Или вы можете это сделать.

 tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
            Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);
            anim.start();
        }
    });

Добавление GlobalLayoutListener для ожидания раздувания представления работало для меня.

Ответ 4

Или вы можете это сделать.

   tv.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        //start your animation here                        
                    }
                }, 1000);