为什么view.startAnimation(动画)在从事件调用时不起作用?

时间:2011-09-29 17:03:26

标签: android android-animation android-event

我创建了一个自定义视图,它使用虚拟TranslateAnimation来设置一些布局属性。我使用Interpolator计算高度,并将其应用于TranslateAnimation的applyTransformation()方法内的视图。

如果我从我的Activity中触发动画,这个效果很好。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Log.i("test", "onCreate()");
    view.expand(); // This method starts the animation
}

当我尝试使用触摸事件做同样的事情时,没有任何反应。

@Override
// This method is touch handler of the View itself
public boolean onTouch(View v, MotionEvent event) {
    Log.i("test", "onTouch()");
    this.expand(); // onTouch is part of the view itself and calls expand() directly
    return true;
}

我的扩展方法如下所示:

public void expand() {
    Log.i("test", "Expand!");

    TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 0) {

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            Log.i("test", "applyTransformation()");

            super.applyTransformation(interpolatedTime, t);

            // do something
        }

    };
    anim.setDuration(500);
    anim.setInterpolator(new AccelerateDecelerateInterpolator());
    this.someInternalView.startAnimation(anim);
}

创建活动后,Logcat显示“onCreate()” 在我的触摸事件中,Logcat显示“onTouch()” 在expand()方法中,Logcat显示“Expand!” - 要么从活动中调用,要么从事件中调用。

方法内部applyTransformation()Logcat显示“applyTransformation()” - 但是!仅当从onCreate()调用expand()时。尝试从事件启动动画的任何尝试都失败了。

这看起来像某种线程问题。这可能吗?有什么我想念的吗?据我在其他帖子中看到,从事件开始动画应该没有任何问题......

提前致谢!

1 个答案:

答案 0 :(得分:1)

试试这个:

public void expand() {
    Log.i("test", "Expand!");
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 0) {

                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    Log.i("test", "applyTransformation()");

                    super.applyTransformation(interpolatedTime, t);

                        // do something
                    }

                };
                anim.setDuration(500);
                anim.setInterpolator(new AccelerateDecelerateInterpolator());
                this.someInternalView.startAnimation(anim); 
            }
        });
    }