共享元素活动转换。活动被破坏时,视图停留在屏幕上

时间:2016-05-22 10:06:48

标签: android

我有两项活动。第一个是闪屏,中间有一个标志。第二个活动在顶部有徽标(徽标小于主要徽标)。一段时间后,第一个活动关闭,徽标使用共享元素活动转换进行动画处理。在第一个活动的onStop中,我完成了它(因为它是一个引人注目的,我不再需要它了)。 问题是,当我按下第二个活动时,即使活动已经隐藏,徽标也会在屏幕上停留一段时间(2-3秒)。 看起来像这样:emulator screenshot

第一项活动:

public class MainActivity extends BaseActivity {

    @BindView(R.id.logo)
    public ImageView imageView;

    private boolean mShouldFinish;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startSecondActivity();
            }
        }, 3000);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if(mShouldFinish) {
            finish();
        }
    }

    private void startSecondActivity() {
        Intent intent = new Intent(this, SecondActivity.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, "logo");
            startActivity(intent, options.toBundle());
        } else {
            startActivity(intent);
        }
        mShouldFinish = true;
    }
}

SecondActivity:

public class SecondActivity extends BaseActivity {

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

}

FirstActivity布局:

<FrameLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.github.guliash.androidexplorer.MainActivity">
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@drawable/ic_android_black_48dp"
        android:layout_gravity="center"
        android:transitionName="logo"
        android:id="@+id/logo"
        android:scaleType="fitCenter"/>
</FrameLayout>

SecondActivity布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_android_black_48dp"
        android:transitionName="logo"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

我做错了什么?

可在此处找到完整代码github repo

2 个答案:

答案 0 :(得分:4)

首先,不要使用这个mShouldFinish技巧,只需调用finish(); 其次,在你的第二个活动中尝试覆盖onBackPressed并在里面调用finish()。

答案 1 :(得分:-1)

我编辑了你的代码,我测试了它是好的:

SplashActivity

public class Splash extends AppCompatActivity {



         final int SPLASH_DISPLAY_LENGTH = 1000;
            public ImageView imageView;


        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.activity_splash);
            imageView = (ImageView)findViewById(R.id.logo);


            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {

                    startSecondActivity();
                }
            }, SPLASH_DISPLAY_LENGTH);
        }

    private void startSecondActivity() {
        Intent intent = new Intent(this, MainActivity.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, "logo");
            startActivity(intent, options.toBundle());
            Splash.this.finish();
        } else {
            startActivity(intent);
            Splash.this.finish();
        }

    }

}

MainActivity

public class MainActivity extends AppCompatActivity {

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

您的布局将是:

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ellip.ir.myapplication.Splash">

    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@drawable/logo"
        android:layout_gravity="center"
        android:transitionName="logo"
        android:id="@+id/logo"
        android:scaleType="fitCenter"/>

</RelativeLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ellip.ir.myapplication.MainActivity">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/logo"
        android:transitionName="logo"
        android:layout_gravity="center_horizontal"/>
</RelativeLayout>

清单

 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">

    </activity>
    <activity android:name=".Splash">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>