Java NineodelDroids动画不适用于API>;10
我正在使用Java NineodelDroids动画不适用于API>;10,java,android,animation,android-animation,nineoldandroids,Java,Android,Animation,Android Animation,Nineoldandroids,我正在使用nineodeldroid库执行动画。API10的动画效果良好,应用程序强制关闭。这是我的代码: import static com.nineoldandroids.view.ViewPropertyAnimator.animate; import android.content.Intent; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.os.Build; im
nineodeldroid
库执行动画。API10的动画效果良好,应用程序强制关闭。这是我的代码:
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
}
});
}
}
我对设备API<10上的这个库有一个问题,它给出了相同的堆栈跟踪。考虑到我使用的是NineodelDroids的源代码,我决定在库中研究这个问题 在一些测试之后,我注意到出现这个错误是因为lib试图调用一些视图中不存在的方法(因为它是旧的API级别)。再搜索一点,我找到了AnimatorProxy类,它有一个名为“wrap”的静态方法。此方法用于封装旧Android版本中的视图对象,模拟某些动画方法的存在,如setScaleX/Y、SetTranslationx/Y 要解决此问题,我必须打开ObjectAnimator类并搜索该行的所有匹配项(在我的库代码中,我找到了4个匹配项): 在该类中,我创建了以下方法:
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;
}
}
不知道它是否能解决您的问题,因为您说过它发生在API 10+上(与我的相反),但这是一个很好的起点。我对设备API<10上的这个库有一个问题,它给出了相同的堆栈跟踪。考虑到我使用的是NineodelDroids的源代码,我决定在库中研究这个问题 在一些测试之后,我注意到出现这个错误是因为lib试图调用一些视图中不存在的方法(因为它是旧的API级别)。再搜索一点,我找到了AnimatorProxy类,它有一个名为“wrap”的静态方法。此方法用于封装旧Android版本中的视图对象,模拟某些动画方法的存在,如setScaleX/Y、SetTranslationx/Y 要解决此问题,我必须打开ObjectAnimator类并搜索该行的所有匹配项(在我的库代码中,我找到了4个匹配项): 在该类中,我创建了以下方法:
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;
}
}
不知道它是否能解决您的问题,因为您说过它发生在API 10+(与我的相反)上,但这是一个很好的起点。我和您一样进行了更改,强制关闭已解决。然而,在API8中,动画的播放方式不同。我和你一样做了改变,强制关闭问题解决了。但是,在API8中,动画的播放方式不同。
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;
}
}
setTarget(target);