19

Итак, проблема, с которой я сталкиваюсь, заключается в том, что анимация, которую я делаю между двумя действиями и двумя общими представлениями, не выглядит великолепно.Анимация между действиями и общими видами: глючит/взламывает концы анимации?

Проблема заключается в том, что ее «глючный» при переходе из Activity2 обратно в Activity1, текстовые объекты, которые по-разному мигают в конце анимации, показывают «больший текст» из Activity2 на долю секунды, поэтому он «мигает».

активность 1 (RecyclerView с тремя пунктами):

enter image description here

активность 2 (Детали):

enter image description here

Я снимал экран, делая анимацию. Когда вы возвращаетесь из Activity2 в Activit2, вы можете видеть, что текст близок в самом конце. Это видео (36MB, извините за размер) показывает это:

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

вопрос: что я делаю неправильно? Почему это так моргает? Я вижу видео на других анимах, и они все супер гладкие и приятные.

Я протестировал различные типы переходов (changeBounds, explode и т. Д. И т. Д.), Но всегда происходит что-то странное. Любые советы, идеи будут высоко оценили =)

МОЙ КОД

MainActivity (Activity1):

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()); 
    } 
} 

DetailsActivity (деятельности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); 
    } 
} 

И макеты, first my_text_view, который находится в списке 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> 

И 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> 

И переход XML (в/RES/переход):

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

и styles.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> 
+0

Я думаю, что этот ответ может помочь вам: http://stackoverflow.com/a/26813670/758458 – howettl

+0

Спасибо за ввод. Итак, определение анимации/переходов в XML, как в моем случае, не работает и не подходит? Вы думаете, это служебная позиция Google? – Ted

+0

Переходы общих объектов оказались немного более громоздкими, чем я ожидал. Я надеюсь, что Google улучшит документацию, потому что ее нет. – howettl

ответ

10

проблема заключается в том, что вы пытаетесь анимировать размер TextView как общий элемент, используя ChangeBounds переход. Это не сработает из-за того, как работает ChangeBounds. Переход ChangeBounds анализирует границы компоновки представления в начале и конце перехода и оживляет между ними. ChangeBounds работает для произвольных просмотров, поэтому он не будет называть setTextSize() на вашем TextView во время перехода для вас ... это то, что вам нужно будет сделать самостоятельно, используя настраиваемый переход, если вы хотите, чтобы размер TextView плавно увеличивался/уменьшался во время анимации. Существует некоторая информация о том, как это сделать в this StackOverflow answer.

+1

Итак, ответ u связан с данными выше, реализующими класс Transition. Я не могу понять, как Google подумает, что кто-то придумывает идею написать такой класс. Im довольно опытный кодер, и у меня не было бы понятия, как писать этот класс. Это кажется очень громоздким и беспорядочным. – Ted

+0

Но. в основном, я копирую этот класс Transition, а затем просто добавляю это в XML вместо этого, как это? Ted

+0

Я просто попробовал именно это, добавил класс java, изменил переход xml, как указано выше (с правильным именем пакета), но тогда анимация не существует, просто прыжок от одного действия до следующего, тот же «сбой» с текстом ... – Ted

Смежные вопросы