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

13

所以,我正在尝试在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);
    }
}

现在还处于早期阶段,所以我无法得出任何关于这个问题的答案。有任何想法吗?

4个回答

15

您可以使用Runnable来进行动画。 Runnable将在视图创建后运行。无需发布延迟。

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

@TimoBähr,您能在评论区发布您的日志吗? - BennyKok

15
您之所以出现错误,是因为您传递的视图还没有在屏幕上进行测量和布局。 ViewAnimationUtils.createCircularReveal 需要目标视图进行测量以计算动画效果。您还会发现变量 ab 总是为 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();
    }
});

4
或者您可以这样做。
 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添加到等待视图充气的监听器中,这对我很有帮助。

-2

或者你可以这样做。

   tv.postDelayed(new Runnable() {

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

这是否有效,因为它给视图附加到活动的时间? - Antonis427
1
是的,正如Rlay3所提到的那样。 - user3225831

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接