2013-03-01 96 views
12

此问题只发生在果冻豆4.1和4.2(在Galaxy Nexus和Nexus 4上测试)上。 这里是我如何使用overridePendingTransition在果冻豆上使用overridePendingTransition时,屏幕会随机闪烁

当启动一个新的活动:

Intent intent = new Intent(ActivityA.this, ActivityB.class); 
startActivity(intent); 
overridePendingTransition(R.anim.transition_right_to_left, 
        R.anim.transition_right_to_left_out); 

当完成一个活动,以返回到之前的一个

finish(); 
overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out); 

transition_left_to_right

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
android:fromXDelta="-100%p" 
android:toXDelta="0" 
android:duration="@integer/transition_duration"/> 

transition_left_to_right_out

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
android:fromXDelta="0" 
android:toXDelta="100%p" 
android:duration="@integer/transition_duration"/> 

transition_right_to_left

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:fromXDelta="100%p" 
android:toXDelta="0" 
android:duration="@integer/transition_duration"/> 

transition_right_to_left_out

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:fromXDelta="0" 
android:toXDelta="-100%p" 
android:duration="@integer/transition_duration"/> 

这该是多么屏幕闪烁:http://youtu.be/TUKRz2yVF6Q(仅01:00发生)

请告诉我,如果你知道什么我的代码有误,为什么设备屏幕有时会闪烁?谢谢。

编辑:尽量选用对果冻豆ActivityOptions,但它并没有帮助

+1

是一个特定的Android设备或每一个Android设备支持果冻豆在未来的问题? – 2013-03-04 03:13:46

+0

我不知道,因为除Galaxy Nexus和Nexus 4之外,我没有多少设备可以测试。 – Wayne 2013-03-04 03:22:13

+0

但是你可以在不同的操作系统版本上尝试不同的模拟器 – 2013-03-04 04:06:32

回答

5

我有相同的问题。 我能够通过将插补器更改为linear_interpolator而不是accele_decelerate_interpolator来解决此问题。

+0

谢谢,问题解决了! – Wayne 2013-03-21 08:28:00

+1

我的荣幸,如果您在其他论坛上发布此问题,请在此共享此解决方案... – 2013-03-21 09:16:13

2

尝试添加下面一行到你的这两个动画XML文件

android:fillAfter="true" 
+1

感谢您的回答,但这并没有帮助,我认为overridePendingTransition的动画不需要fillAfter。 – Wayne 2013-03-04 05:00:15

+1

'fillBefore'呢?如果在绘制静态(非动画)视图之后绘制动画的第一帧,则会发生闪烁 - 例如,由于目标视图首先在屏幕上绘制,因此可能会在transition_left_to_right上发生,并开始动画开始后立即移出屏幕 – 2013-03-11 01:27:01

+0

FillBefore也无法帮助。 – Wayne 2013-03-11 03:33:53

2

你有“不要让任何机会活动“选项在设置中的”开发人员选项“部分中打开?

+1

对不起,“不要保留活动”选项未启用。 – Wayne 2013-03-09 15:17:57

-1

愚蠢的建议,但你有没有尝试改变动画/完成()的顺序?

像这样:

overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out); 
finish(); 
+1

对不起,但Android文档说,必须在finish()或startActivity()之后立即调用overridePendingTransition(http://developer.android.com/reference/android/app/Activity.html#overridePendingTransition(int,int) )。我已经尝试过,但当然不能。 – Wayne 2013-03-11 03:36:24

0

您可以通过延迟活动转换并使用某个视图元素作为共享元素转换“锚点”来解决此问题。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_match_score); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getWindow().setEnterTransition(null); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // Postpone the shared element enter transition. 
     postponeEnterTransition(); 
    } 
} 

现在,你只需要在你的应用程序一个点,一切都应该在屏幕上显示来电“scheduleStartPostponedTransition()”。这项技术运行良好,解决了切换活动时的屏幕闪光问题。

// 
// Schedules the shared element transition to be started immediately 
// after the shared element has been measured and laid out within the 
// activity's view hierarchy. Some common places where it might make 
// sense to call this method are: 
// 
// (1) Inside a Fragment's onCreateView() method (if the shared element 
//  lives inside a Fragment hosted by the called Activity). 
// 
// (2) Inside a Picasso Callback object (if you need to wait for Picasso to 
//  asynchronously load/scale a bitmap before the transition can begin). 
// 
// (3) Inside a LoaderCallback's onLoadFinished() method (if the shared 
//  element depends on data queried by a Loader). 
// 
public void scheduleStartPostponedTransition(final ImageView sharedElement) { 
    LogHelper.v(TAG, "scheduleStartPostponedTransition"); 
    sharedElement.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() { 
       @Override 
       public boolean onPreDraw() { 
        sharedElement.getViewTreeObserver().removeOnPreDrawListener(this); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         startPostponedEnterTransition(); 
        } 
        return true; 
       } 
      }); 
} 

http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

+0

您提出的过渡API已添加到API v20中 - Jelly Bean是API v16 – 2017-02-24 11:34:45