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

时间:2014-10-20 21:23:41

标签: 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);
    }
}

现在还很早,所以我无法找到任何答案。有什么想法吗?

4 个答案:

答案 0 :(得分: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();
    }
});

答案 1 :(得分:14)

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

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

答案 2 :(得分: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以等待视图被夸大为我工作。

答案 3 :(得分:-2)

或者你可以这样做。

   tv.postDelayed(new Runnable() {

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