安卓棒棒糖共享元素过渡闪烁问题

21

我在Lollipop上的共享元素转换中看到了奇怪的东西。 共享元素在开始动画之前会闪烁(请参见视频https://www.youtube.com/watch?v=DCoyyC_S-9A)。

我不知道为什么会这样。 但是当我将<item name="android:windowSharedElementsUseOverlay">false</item>添加到我的主题中时,我不会看到闪烁,但过渡效果不好(看起来只有一半正在进行第二个隐藏的动画)。

其他转换设置:

<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>

我正在使用ActivityCompat和ActivityOptionsCompat启动活动:

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(ActivityMain.this,
                        new Pair<View, String>(playButton, getString(R.string.translation_control_button)),
                        new Pair<View, String>(findViewById(R.id.playerImage), getString(R.string.translation_artwork)));

ActivityCompat.startActivity(this, pendingIntent, options.toBundle());

第一项活动:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/main_container">

        <include layout="@layout/toolbar"/>

        <FrameLayout
            android:id="@+id/activity_main_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"></FrameLayout>

        <TableLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:padding="7dp"
            android:stretchColumns="*"
            android:id="@+id/player_toolboxTable"
            android:background="?colorPrimary">

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/player_toolbox">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_fav"
                    android:src="@drawable/rating_not_important"
                    android:onClick="playerFav"
                    android:background="@drawable/button_selector_semi_white"
                    />

                <ImageView
                    android:src="@drawable/av_pause_over_video"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_play"
                    android:onClick="playerPlay"
                    android:background="@drawable/button_selector_semi_white"
                    android:transitionName="@string/translation_control_button"
                    />

                <ImageView
                    android:src="@drawable/social_share"
                    android:layout_width="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_share"
                    android:background="@drawable/button_selector_semi_white"
                    android:layout_height="wrap_content"
                    android:onClick="playerShare"
                    />

                <ImageView
                    android:src="@drawable/content_save"
                    android:layout_width="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_record"
                    android:background="@drawable/button_selector_semi_white"
                    android:layout_height="wrap_content"
                    android:onClick="playerRecord"
                    />
            </TableRow>
        </TableLayout>

    </LinearLayout>

</com.heinrichreimersoftware.materialdrawer.DrawerFrameLayout>

第二个活动:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context=".activities.CommunityActivity">

    <include layout="@layout/toolbar"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:orientation="vertical">

        <Button
            android:id="@+id/community_google_plus_group"
            android:text="@string/community_google_plus"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_action_gplus"
            android:gravity="left|center_vertical"
            style="@style/MaterialButton"
            />

        <Button
            android:id="@+id/community_google_fb"
            android:text="@string/community_facebook"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_action_facebook"
            android:gravity="left|center_vertical"
            style="@style/MaterialButton"
            />

        <Button
            android:id="@+id/community_mail"
            android:text="@string/community_mail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_action_gmail"
            android:gravity="left|center_vertical"
            style="@style/MaterialButton"
            />
    </LinearLayout>

    <include layout="@layout/include_mini_player"/>

</LinearLayout>

包含mini_player.xml

<fragment
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mini_player_fragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name=".fragments.MiniPlayerFragment"
    android:layout_width="fill_parent"
    android:layout_height="72dp"
    tools:layout="@layout/fragment_mini_player"/>

mini_player碎片:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="?colorPrimary"

    >

    <ImageView
        android:id="@+id/player_artwork"
        android:layout_width="52dp"
        android:scaleType="centerCrop"
        android:layout_height="52dp"
        android:src="@drawable/music_icon"
        android:layout_margin="5dp"
        android:layout_gravity="center_vertical"
        android:transitionName="@string/translation_artwork"
        />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_marginLeft="5dp"
        android:layout_gravity="center_vertical">

        <TextView
            android:textColor="@android:color/white"
            android:text=" "
            android:textSize="8pt"
            android:id="@+id/player_song_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />

        <TextView
            android:textColor="@android:color/white"
            android:text=" "
            android:textSize="7pt"
            android:id="@+id/player_song_artist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </LinearLayout>


    <ImageView
        android:id="@+id/player_play_button"
        android:layout_gravity="center_vertical"
        android:layout_width="42dp"
        android:layout_height="42dp"
        android:layout_marginRight="5dp"
        android:src="@drawable/av_pause_over_video"
        android:background="@drawable/button_selector_semi_white"
        android:transitionName="@string/translation_control_button"
        />

</LinearLayout>

你有任何想法为什么会发生这种情况吗?


你使用什么代码来启动过渡效果?你的布局层次结构是怎样的? - Alex Lockwood
@AlexLockwood 我添加了更多的代码。除了共享元素闪烁之外,我看到整个窗口在闪烁(在这里描述:https://dev59.com/cl4c5IYBdhLWcg3wD2rC) - radzio
这篇文章可能与以下内容相关:https://dev59.com/5V8d5IYBdhLWcg3woDYZ - Alex Lockwood
对我们来说,我们一直在使用24版的alpha构建。回到23.x版本是解决问题的关键。 - Prachi
1个回答

11

太好了!我终于解决了这个问题。

闪烁的屏幕是一个常见的问题,可以在这里找到描述:在活动之间进行图像转换时屏幕闪烁(感谢@AlexLockwood)

共享元素的闪烁是由DrawerLayout引起的。 我启动新的Activity过早了。 当我将ActivityCompat.startActivity移动到DrawerLayout.DrawerListeneronDrawerClosed方法中时,一切都开始像魅力般地工作了。


更好的解决方案是使用Google从抽屉中启动活动的代码:mHandler.postDelayed(new Runnable() { @Override public void run() { ... } }, 250); - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接