studio start recyclerview example animate activity activities android android-animation android-transitions shared-element-transition activity-transition

android - start - Animación entre actividades y vistas compartidas: ¿glitchy/hack en los extremos de la animación?



shared element transition recyclerview to activity (1)

El problema es que está intentando animar el TextView un TextView como un elemento compartido utilizando una transición ChangeBounds . Esto no funcionará debido a la forma en que funciona ChangeBounds . La transición de ChangeBounds analiza los límites de diseño de una vista al inicio y al final de la transición y anima entre los dos. ChangeBounds funciona para vistas arbitrarias, por lo que no llamará a setTextSize() en su TextView durante la transición para usted ... esto es algo que tendría que hacer usando una transición personalizada si desea ver que el tamaño de TextView aumenta sin problemas. / Disminución durante la animación. Hay algo de información sobre cómo hacer esto en esta respuesta de StackOverflow .

Entonces, el problema al que me estoy enfrentando es que la animación que hago entre dos Actividades y dos vistas compartidas no se ve muy bien.

El problema es que es "glitchy", al pasar de Activity2 a Activity1, las TextViews compartidas parpadean al final de la animación, revelando el "texto más grande" de Activity2 durante una fracción de segundo, por lo que "parpadea ".

Actividad 1 (RecyclerView con tres elementos):

Actividad 2 (Detalles):

Filmé la pantalla, mientras hacía la animación. Al regresar de Activity2 a Activit2, puede ver el texto parpadeando al final. Este video (36MB, lo siento por el tamaño) lo muestra:

https://drive.google.com/file/d/0B3wIZ9CS9Kj_a0MyVFlzX1YtY0E/view?usp=sharing

La pregunta es: ¿qué estoy haciendo mal? ¿Por qué está parpadeando así? Veo videos en otras animaciones, y todas son súper suaves y agradables.

He probado diferentes tipos de transiciones (changeBounds, explode, etc, etc), pero siempre hay algo raro. Cualquier consejo, ideas serían apreciadas grandemente =)

MI CÓDIGO

Actividad principal (Actividad 1):

package se.snapcode.lollipoptest; import android.app.Activity; import android.app.ActivityOptions; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.GestureDetectorCompat; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.util.Pair; import android.view.GestureDetector; import android.view.Menu; import android.view.MenuItem; import android.support.v7.widget.RecyclerView; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private RecyclerView mRecyclerView; private MyAdapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; GestureDetectorCompat gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView mRecyclerView.setHasFixedSize(true); // use a linear layout manager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); // specify an adapter (see also next example) String[] strings = new String[3]; strings[0] = "A1"; strings[1] = "A2"; strings[2] = "A3"; mAdapter = new MyAdapter(strings); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { final TextView headerView = (TextView)view.findViewById(R.id.textView1); final TextView textView = (TextView)view.findViewById(R.id.textView2); Intent intent = new Intent(MainActivity.this, DetailsActivity.class); intent.putExtra("header", headerView.getText().toString()); intent.putExtra("text", textView.getText().toString()); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create((View)headerView, "header"), Pair.create((View)textView, "text")); startActivity(intent, options.toBundle()); } }); RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST); mRecyclerView.addItemDecoration(itemDecoration); // this is the default; this call is actually only necessary with custom ItemAnimators mRecyclerView.setItemAnimator(new DefaultItemAnimator()); } }

DetallesActividad (Actividad 2):

package se.snapcode.lollipoptest; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class DetailsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_details); String header = getIntent().getStringExtra("header"); String text = getIntent().getStringExtra("text"); TextView tv1 = (TextView)findViewById(R.id.tv_details_header); tv1.setText(header); TextView tv2 = (TextView)findViewById(R.id.tv_details_text); tv2.setText(text); } }

Y los diseños, primero my_text_view que está en la lista de RecyclerView:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" android:background="?android:attr/selectableItemBackground" android:colorControlHighlight="@android:color/holo_blue_light" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="MY HEADER IS HERE" android:transitionName="header" android:id="@+id/textView1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="This is some text that is of relevance" android:transitionName="text" android:id="@+id/textView2" /> </LinearLayout>

Y el activity_details.xml:

<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: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" tools:context="se.snapcode.lollipoptest.DetailsActivity"> <TextView android:id="@+id/tv_details_header" android:text="A1" android:layout_width="wrap_content" android:transitionName="header" android:textSize="48dp" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_details_text" android:text="Some text of lesser importance" android:layout_width="wrap_content" android:textSize="24dp" android:transitionName="text" android:layout_height="wrap_content" /> </LinearLayout>

Y el xml de transición (en / res / transición):

<?xml version="1.0" encoding="utf-8"?> <transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <changeBounds/> <explode /> </transitionSet>

y los estilos.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppTheme" parent="android:Theme.Material.Light"> <!-- enable window content transitions --> <item name="android:windowContentTransitions">true</item> <!-- specify enter and exit transitions --> <item name="android:windowEnterTransition">@android:transition/slide_left</item> <item name="android:windowExitTransition">@android:transition/slide_right</item> <!-- specify shared element transitions --> <item name="android:windowSharedElementEnterTransition"> @transition/change_image_transform</item> <item name="android:windowSharedElementExitTransition"> @transition/change_image_transform</item> </style> </resources>