Ошибка при попытке создать круговое раскрытие: 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);