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

Android 尝试创建循环显示时出错:IllegalStateException:无法在分离的视图上启动此动画,android,android-5.0-lollipop,Android,Android 5.0 Lollipop,所以,我尝试在TextView上的API级别21上创建一个循环显示,但我一直遇到这个错误。起初我认为这与我尝试的片段的生命周期有关,但后来我在一个活动中尝试了同样的事情,但仍然不起作用 代码如下: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan

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

现在还为时过早,所以我真的找不到任何关于这个问题的答案。有什么想法吗?

由于您传入的视图尚未在屏幕上进行测量和布局,因此出现了错误
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();
    }
});
或者你可以这样做

   tv.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        //start your animation here                        
                    }
                }, 1000);
 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();
        }
    });
或者你可以这样做

   tv.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        //start your animation here                        
                    }
                }, 1000);
 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();
        }
    });
tv.getViewTreeObserver().addOnGlobalYoutListener(新的ViewTreeObserver.OnGlobalYoutListener()){
@凌驾
公共图书馆{
if(android.os.Build.VERSION.SDK\u INT

添加GlobalLayoutListener以等待视图膨胀对我有效。

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

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

这是否有效,因为它给了时间将视图附加到活动?是的,就像Rlay3一样mentioned@TimoBähr您可以将您的日志发布在这里的评论中吗。