代码之家  ›  专栏  ›  技术社区  ›  GaboSampaio

使用共享元素动画在活动之间更改时闪烁(闪烁)屏幕

  •  0
  • GaboSampaio  · 技术社区  · 7 年前

    我正在开发一个android应用程序,并在启动屏幕活动和登录活动之间使用共享元素转换。在过渡过程中,我可以看到我手机、应用程序和所有东西的背景,从我的应用程序中唯一能看到的就是徽标动画,其他一切都消失了。

    这是我的代码:

    初始屏幕(原点)

    <LinearLayout
            android:id="@+id/meofat_logo"
            android:layout_width="86dp"
            android:layout_height="86dp"
            android:layout_gravity="center"
            android:background="@drawable/meofat_logo"
            android:orientation="vertical"
            android:layout_marginTop="210dp"
            android:elevation="24dp"
            android:transitionName="logo"/>
        <LinearLayout
            android:id="@+id/meofat_tipo"
            android:layout_width="160dp"
            android:layout_height="50dp"
            android:background="@drawable/meofat_tipo"
            android:layout_gravity="center"
            android:elevation="24dp"
            android:transitionName="tipo"/>
    

    登录屏幕(目标)

    <LinearLayout
                android:id="@+id/meofat_logo"
                android:layout_width="58dp"
                android:layout_height="58dp"
                android:layout_gravity="center"
                android:background="@drawable/meofat_logo"
                android:orientation="vertical"
                android:layout_marginTop="80dp"
                android:elevation="24dp"
                android:transitionName="logo"/>
    
            <LinearLayout
                android:id="@+id/meofat_tipo"
                android:layout_width="106dp"
                android:layout_height="33dp"
                android:background="@drawable/meofat_tipo"
                android:layout_gravity="center"
                android:elevation="24dp"
                android:transitionName="tipo"/>
    

    SplashScreen代码:

    public class RedirectActivity extends Activity {
        private static int SPLASH_TIME_OUT = 2000;
        LinearLayout logo,tipo;
        Animation upToDown;
        Animation downToUp;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            requestWindowFeature(Window.FEATURE_NO_TITLE);
    
            setContentView(R.layout.activity_redirect);
    
            logo = (LinearLayout) findViewById(R.id.meofat_logo);
            tipo = (LinearLayout) findViewById(R.id.meofat_tipo);
            upToDown = AnimationUtils.loadAnimation(this,R.anim.uptodown);
            logo.setAnimation(upToDown);
            downToUp = AnimationUtils.loadAnimation(this,R.anim.downtoup);
            tipo.setAnimation(downToUp);
    
    
    
    
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    MEOFatSession session = new MEOFatSession(RedirectActivity.this);
    
                    if (session.isLoggedIn()){
                        Intent goToMeasurement = new Intent(RedirectActivity.this,
                                MeasurementActivity.class);
                        RetrofitInitializer.getInstance().addCredentials(session.getCredentials());
                        startActivity(goToMeasurement);
                        finish();
                    } else {
                        Intent goToLogin = new Intent(RedirectActivity.this,
                                LoginActivity.class);
                        ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.
                                makeSceneTransitionAnimation(RedirectActivity.this,findViewById(R.id.meofat_logo),
                                        "logo");
                        startActivity(goToLogin,  optionsCompat.toBundle());
                        finish();
                    }
    
                }
            },SPLASH_TIME_OUT);
    
    
        }
    }
    

    试图说明问题的gif。

    https://giphy.com/gifs/d1G6hKgTAsX5hOo0

    3 回复  |  直到 7 年前
        1
  •  2
  •   GaboSampaio    7 年前

    删除finish()方法解决了这个问题。显然,它会在动画期间破坏活动,导致其消失。

        2
  •  1
  •   A. Ferrand    6 年前

    喜欢 @GaboSampaio 说, finish() 导致闪烁。您可以延迟:

    Handler handler = new Handler();
    handler.postDelayed(this::finish, 1000);
    
        3
  •  -1
  •   Wai Ha Lee captain-yossarian from Ukraine    7 年前
    Intent goToLogin = new Intent(RedirectActivity.this, LoginActivity.class);
    
    ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(
        RedirectActivity.this,
    
        // Now we provide a list of Pair items which contain the view we can transitioning
        // from, and the name of the view it is transitioning to, in the launched activity
        new Pair<View, String>(findViewById(R.id.logo_splash),
        "tipo"));
    
    ActivityCompat.startActivity(RedirectActivity.this, intent, activityOptions.toBundle());
    
    推荐文章