Android的 - 删除查看时,它的动画完成 [英] Android - remove View when its animation finished

查看:236
本文介绍了Android的 - 删除查看时,它的动画完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,我有增加了一个的TextView 我的的FrameLayout 并启动动画的方法。该方法应能够被称为越高(对于多个动画)。这是工作的罚款,因为我可以在同一时间运行多个动画,但我要删除的动画视图时,它的动画完成。

 公共无效showMoneyAnimation(INT amoutAddedOrRemoved){
    //添加钱
        浮TEXTSIZE = Math.round((global.getDisplaySize()Y / scaleValue)* 34.0);
        最终的TextView临时=新的TextView(背景);
        temp.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
        temp.setText(++ amoutAddedOrRemoved +$);
        temp.setTextAppearance(背景下,R.style.tsMoney1);
        temp.setTypeface(global.getFont(Grobold));
        temp.setTextSize(TypedValue.COMPLEX_UNIT_PX,TEXTSIZE);        sb_money.measure(0,0);
        temp.measure(0,0);
        INT xtemp =((int)的sb_money.getX()+ sb_money.getMeasuredWidth()) - temp.getMeasuredWidth();
        temp.setX(xtemp);
        temp.setY(0);        //添加我的文本到我的FrameLayout
        bgFl.addView(临时);        动画atemp = AnimationUtils.loadAnimation(背景下,R.anim.addanim);
        temp.startAnimation(atemp);
        atemp.setAnimationListener(新Animation.AnimationListener(){
            @覆盖
            公共无效onAnimationStart(动画动画){            }            @覆盖
            公共无效onAnimationEnd(动画动画){
                //这是问题的起源!
                bgFl.removeView(临时);
            }            @覆盖
            公共无效onAnimationRepeat(动画动画){            }
        });
    }

但我发现了一个 NullPointerException异常,也许是因为视图具有相同的名称?
我怎样才能解决这个问题?请帮助:)

下面的例外:

  01-27 22:52:25.633 25975-25975 / de.cookedapps.needforweed E / AndroidRuntime:致命异常:主要
工艺:de.cookedapps.needforweed,PID:25975
显示java.lang.NullPointerException
        在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3146)
        在android.view.View.getDisplayList(View.java:14283)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        在android.view.View.getDisplayList(View.java:14225)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        在android.view.View.getDisplayList(View.java:14225)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        在android.view.View.getDisplayList(View.java:14225)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        在android.view.View.getDisplayList(View.java:14225)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        在android.view.View.getDisplayList(View.java:14225)
        在android.view.View.getDisplayList(View.java:14330)
        在android.view.HardwareRenderer $ GlRenderer.buildDisplayList(HardwareRenderer.java:1588)
        在android.view.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:1467)
        在android.view.ViewRootImpl.draw(ViewRootImpl.java:2754)
        在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2620)
        在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2188)
        在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
        在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6585)
        在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:803)
        在android.view.Choreographer.doCallbacks(Choreographer.java:603)
        在android.view.Choreographer.doFrame(Choreographer.java:573)
        在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:789)
        在android.os.Handler.handleCallback(Handler.java:733)
        在android.os.Handler.dispatchMessage(Handler.java:95)
        在android.os.Looper.loop(Looper.java:136)
        在android.app.ActivityThread.main(ActivityThread.java:5586)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:515)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1268)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        在dalvik.system.NativeStart.main(本机方法)


解决方案

这可能是因为你将不得不以这种方式去除的观点,因为你只应在尝试接触任何从UI线程你的意见的问题(避免其他线程试图改变在同一时间,这将只是导致问题),你的UI元素。出于这个原因,Android提供了一个调用的方法<一href=\"http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)\"相对=nofollow> runOnUiThread()来指导你的code在正确的线程执行操作。

像这样的东西应该让你在正确的方向。把这个在你的 onAnimationEnd 方法。

  //获取parentView ...
parentView.post(新的Runnable(){
    公共无效的run(){
        //它的工作原理没有runOnUiThread,但所有的UI更新必须
        //可以在UI线程上完成
        activity.runOnUiThread(新的Runnable(){
            公共无效的run(){
                parentView.removeView(视图);
            }
        });
    }
}

Hey I have a method which adds a TextView to my FrameLayout and starts the Animation. The method should be able to be called more often (for multiple Animations). That is working fine since I can run multiple Animations at one time, but i want to remove the animated view when its animation has finished.

public void showMoneyAnimation(int amoutAddedOrRemoved){
    //Adding Money
        float textSize = Math.round((global.getDisplaySize().y / scaleValue) * 34.0);
        final TextView temp = new TextView(context);
        temp.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
        temp.setText("+ " + amoutAddedOrRemoved + "$");
        temp.setTextAppearance(context, R.style.tsMoney1);
        temp.setTypeface(global.getFont("Grobold"));
        temp.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);

        sb_money.measure(0, 0);
        temp.measure(0,0);
        int xtemp = ((int) sb_money.getX() + sb_money.getMeasuredWidth()) - temp.getMeasuredWidth();
        temp.setX(xtemp);
        temp.setY(0);

        //Adding My Text to my FrameLayout
        bgFl.addView(temp);

        Animation atemp = AnimationUtils.loadAnimation(context, R.anim.addanim);
        temp.startAnimation(atemp);
        atemp.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // This is the problem's origin!
                bgFl.removeView(temp);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

But I'm getting a NullPointerException, maybe because the views have the same name? How can I work around that problem? Please help :)

Here the Exception:

01-27 22:52:25.633  25975-25975/de.cookedapps.needforweed E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: de.cookedapps.needforweed, PID: 25975
java.lang.NullPointerException
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3146)
        at android.view.View.getDisplayList(View.java:14283)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        at android.view.View.getDisplayList(View.java:14225)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        at android.view.View.getDisplayList(View.java:14225)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        at android.view.View.getDisplayList(View.java:14225)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        at android.view.View.getDisplayList(View.java:14225)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3284)
        at android.view.View.getDisplayList(View.java:14225)
        at android.view.View.getDisplayList(View.java:14330)
        at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1588)
        at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1467)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2754)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2620)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2188)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6585)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
        at android.view.Choreographer.doCallbacks(Choreographer.java:603)
        at android.view.Choreographer.doFrame(Choreographer.java:573)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5586)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at dalvik.system.NativeStart.main(Native Method)

解决方案

It's likely that you will have issues removing the view in this way since you should only be attempting to touch any of your views from the UI thread (to avoid other threads trying to change your UI elements at the same time which will just cause problems). For this reason Android provides a method called runOnUiThread() that will instruct your code to perform an action in the correct thread.

Something like this should get you pointed in the right direction. Place this in your onAnimationEnd method.

//get the parentView...
parentView.post(new Runnable() {
    public void run () {
        // it works without the runOnUiThread, but all UI updates must 
        // be done on the UI thread
        activity.runOnUiThread(new Runnable() {
            public void run() {
                parentView.removeView(view);
            }
        });
    }
}

这篇关于Android的 - 删除查看时,它的动画完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆