gpt4 book ai didi

android - Android 上的动画错误?

转载 作者:行者123 更新时间:2023-11-29 00:18:59 25 4
gpt4 key购买 nike

这很难解释,但我们开始吧!

好的,在我得到放置动画的 fragment 之前的过渡将是:

MainActivity(扩展 Activity)-> loginActivity(extendsActivity)-> 现在我调用:

Intent homeIntent = new Intent(loginActivity.this, HomeActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("risposta",(Serializable)risposta);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // read below (StackOverFlow)
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // read below (StackOverFlow)
homeIntent.putExtras(bundle);
startActivity(homeIntent);

开始 HomeActivity 扩展 FragmentActivity 并在 onCreateView() 结束时添加我的 Fragment CircleFragment @OverrideonResume() 上执行此操作:

    RotateAnimation rotateAnimation1 = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation1.setInterpolator(new LinearInterpolator());
rotateAnimation1.setDuration(4000);
rotateAnimation1.setRepeatCount(Animation.INFINITE);
radar.startAnimation(rotateAnimation1);

或 XML(都试过):

<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="25%"
android:duration="4000"
android:startOffset="0"
/>

发生了什么?

SOMETIMES 效果不好(有时还好!):开始大约 ~(50%, 25%)(或 0.5、0.25),不完全(计算)但是如果我让屏幕熄灭然后恢复它,一切都会恢复正常 :O

为什么奇怪?

  1. 您是否看到评论的两行清理任务并在顶部启动 Activity ?如果我不设置它,一切正常
  2. 如果我将它作为 MainActivity -> HomeActivity 启动并完成(而不是清除任务),它也能正常工作。

发生了什么事?

提前致谢。

最佳答案

当您听到诸如“有时效果不佳”这样的说法时,请不要低估这一点。这基本上意味着可能涉及时间因素。由于不一定知道多线程操作的执行顺序,因此可能会在不同的 CPU/GPU 负载之前或之后和/或期间发生几毫秒。同时,提前几毫秒可能意味着其他事情还没有完成,我们可能需要完成的事情或者它可能是“密集的”。

在 Android Activity/Fragment 生命周期中,thinks“或多或少”保证以特定顺序发生。

如果您添加有时 + 或多或少,您就有了未知的秘诀……

我没有尝试过您的特定场景,但我建议您执行以下步骤:

  1. 除非您的布局已经布置好,否则不要制作动画。你得等一等。
  2. 除非您的 View 已创建,否则不要制作动画。你不能 :D

因此,即使“有时工作正常”,我怀疑您有时是因为您在 View 未完成时设置动画太早了。不要将已经令人困惑的 onCreatedView 方法名称与“是的, View 已创建并布局。”混淆。创建!=布局。

那么什么时候布局 View 呢?

当 Android 最终完成大量测量和绘图时。

我们怎么知道?

通过使用您今天将看到的最丑陋的代码 fragment ……

示例(在您的 fragment 中):

private volatile boolean mRootLayoutComplete = false; //just a global flag to let the Fragment know when we've been through this.

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.your_fragment_layout, container, false);
// add a GlobalLayoutListener to hear back from the Layout engine.
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// This beauty can be thanked to Android for changing the name of the method.
// In any case, you must unsusbcribe to this immediately.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// Mark this on a volatile global variable in case you want to use it elsewhere.
mRootLayoutComplete = true;

// Now you can ask: Is my view Created and not yet animated?
if ( mViewHasBeenCreated && !mRadarHasBeenAnimated ) {
animate(mRadar); // call a method that will do the animation
}
};
} // some {} may be wrong, I did it in this text editor :D

现在您需要标记 mViewHasBeenCreated...或者您可以检查是否 mRadar != null 而不是仅仅使用信号量。

继续我的例子......

// Define this flag too, because things are asynchronous we don't know who's gonna happen first!
private volatile boolean mViewHasBeenCreated = false;

在你的:

@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
mViewHasBeenCreated = true;
super.onViewCreated(view, savedInstanceState);
}

在你的 onResume 中:

boolean mRadarHasBeenAnimated = false; //flag to avoid multiple animations.

@Override
public void onResume() {
super.onResume();
if ( mRootLayoutComplete && mViewHasBeenCreated && !mRadarHasBeenAnimated ) {
animate(mRadar); // could also check for null here
}
}

还有动画:

void animate(final View view) {
if ( view == null ) {
return;
}
// your animation code
view.animate(youranimation);
mRadarHasBeenAnimated = true;
}

最后,如果你想在每次执行 onResume 时都为“雷达”设置动画,那么你必须重新设置它......

@Override
public void onPause() {
super.onPause();
mRadarHasBeenAnimated = false;
}

这应该可以解决问题。

基本上,您仅在满足某些条件(特别是 mRootLayoutComplete)后才为您的 View 设置动画,并且所有标志都是为了避免多次运行它,尤其是在 CREATION 期间。因为你不知道哪个会先发生,所以你需要“等待”,只有在你确定可以的时候才去做。

祝你好运!

p.d.:我没有按原样测试上面的代码,但我已经在很多应用程序中使用了这个技巧并且它一直有效。

关于android - Android 上的动画错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24332606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com