首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NineOldAndroids动画在API>10上不起作用

NineOldAndroids动画在API>10上不起作用
EN

Stack Overflow用户
提问于 2013-10-26 22:11:33
回答 1查看 2.9K关注 0票数 1

我正在使用NineOldAndroid库来执行动画。动画在API<=10上运行得很好,但对于API>10来说,应用强制关闭。这是我的代码:

代码语言:javascript
复制
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.MenuItem;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.Animator.AnimatorListener;
import com.nineoldandroids.animation.ObjectAnimator;

public class ActivityActualMain extends SherlockActivity  {
    LinearLayout container1, container2;
    RelativeLayout viewTree;
    ImageView image, image1, image2;
    TextView tv, tv1, tv2, tv3, tv4;
    ObjectAnimator anim;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final int duration = 2000;
    setContentView(R.layout.activity_actual_main);

    ActionBar bar = getSupportActionBar();
    bar.setDisplayHomeAsUpEnabled(true);
    bar.setBackgroundDrawable(getResources().getDrawable(
            R.drawable.red_actionbar));
    viewTree = (RelativeLayout) findViewById(R.id.viewTree);
    container1 = (LinearLayout) findViewById(R.id.linearLayout1);
    container2 = (LinearLayout) findViewById(R.id.linearLayout2);
    image = (ImageView) findViewById(R.id.imageView1);
    image1 = (ImageView) findViewById(R.id.imageView2);
    image2 = (ImageView) findViewById(R.id.imageView3);
    tv = (TextView) findViewById(R.id.text_tech_des);

    viewTree.getViewTreeObserver().addOnGlobalLayoutListener(//to check if the layout has been placed in activity
            new OnGlobalLayoutListener() {
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < 16) {
                        viewTree.getViewTreeObserver().removeGlobalOnLayoutListener(this);}
                    else{
                        viewTree.getViewTreeObserver()
                        .removeOnGlobalLayoutListener(this);
                    }

                    anim = ObjectAnimator.ofFloat(image, "y", 0f,
                            image.getTop());

                    anim.addListener(new AnimatorListener() {

                        @Override
                        public void onAnimationStart(Animator arg0) {
                            // TODO Auto-generated method stub
                            ObjectAnimator.ofFloat(tv, "alpha", 1, 0, 1)
                                    .setDuration(duration).start();//line no 82
                            ObjectAnimator.ofFloat(container1, "x", 0f,
                                    container1.getLeft()).setDuration(1000).start();
                            ObjectAnimator.ofFloat(container2, "x", 0f,
                                    container2.getLeft()).setDuration(1000).start();
                        }

                        @Override
                        public void onAnimationRepeat(Animator arg0) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onAnimationEnd(Animator arg0) {
                            // TODO Auto-generated method stub
                        }

                        @Override
                        public void onAnimationCancel(Animator arg0) {
                            // TODO Auto-generated method stub

                        }
                    });
                    anim.setDuration(duration).start();//line no 106
                }
            });

}
}

这是我的堆栈跟踪:

代码语言:javascript
复制
    10-26 19:23:15.203: E/AndroidRuntime(21541): FATAL EXCEPTION: main
10-26 19:23:15.203: E/AndroidRuntime(21541): java.lang.NullPointerException
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:523)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:410)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:538)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:928)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:951)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ObjectAnimator.start(ObjectAnimator.java:385)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.vishalaksh.technex.ActivityActualMain$2$1.onAnimationStart(ActivityActualMain.java:82)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:937)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:951)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.nineoldandroids.animation.ObjectAnimator.start(ObjectAnimator.java:385)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.vishalaksh.technex.ActivityActualMain$2.onGlobalLayout(ActivityActualMain.java:106)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:808)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1768)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.Choreographer.doFrame(Choreographer.java:532)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.os.Handler.handleCallback(Handler.java:730)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.os.Looper.loop(Looper.java:137)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at android.app.ActivityThread.main(ActivityThread.java:5103)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at java.lang.reflect.Method.invokeNative(Native Method)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at java.lang.reflect.Method.invoke(Method.java:525)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-26 19:23:15.203: E/AndroidRuntime(21541):    at dalvik.system.NativeStart.main(Native Method)
EN

回答 1

Stack Overflow用户

发布于 2013-11-01 01:18:02

我在设备API < 10上使用这个库时遇到了一个问题,它提供了相同的堆栈跟踪。考虑到我使用的是NineOldAndroids的源代码,我决定在库中调查这个问题。

在一些测试之后,我注意到这个错误的发生是因为lib试图调用视图上不存在的一些方法(因为它是一个旧的API级别)。再搜索一下,我发现了AnimatorProxy类,它有一个名为"wrap“的静态方法。此方法用于封装旧Android版本中的View对象,模拟一些动画方法的存在,如setScaleX/Y,setTransalationX/Y。

为了解决这个问题,我不得不打开ObjectAnimator类并搜索此行的所有匹配项(在我的库代码中,我找到了4个匹配项):

代码语言:javascript
复制
mTarget = target;

在这个类中,我创建了以下方法:

代码语言:javascript
复制
private void setTarget(Object obj) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB && obj instanceof View) {
        mTarget = AnimatorProxy.wrap((View) obj);
    } else {
        mTarget = obj;
    }
}

并将上面的行替换为:

代码语言:javascript
复制
setTarget(target);

不知道它是否能解决你的问题,因为你说它发生在API 10+ (与我相反),但这是一个很好的起点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19607703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档