尝试创建循环时出错:IllegalStateException:无法在分离视图上启动此动画

Ant*_*427 13 android android-5.0-lollipop

所以,我正在尝试在TextView上创建API级别21的循环显示,但我一直收到此错误.起初我认为它与我尝试它的片段的生命周期有关,但后来我在一个活动中尝试了同样的事情,它仍然无法工作.

这是代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在还很早,所以我真的找不到任何答案.有任何想法吗?

rla*_*ay3 15

您收到错误是因为您传入的视图尚未测量并在屏幕上显示.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();
    }
});
Run Code Online (Sandbox Code Playgroud)


Ben*_*Kok 15

您可以Runnable用来做动画.该Runnable视图的创建后将会运行.无需发布延迟.

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