1

Что я хочу делать:Объединение Трансаляции + Переход к анимации активности

Допустим, у меня есть изображение в правом верхнем углу экрана.

A. Когда я нажимаю на него он будет двигаться/перевести в центр экрана

B. Затем он должен оживить в новую деятельность, используя SharedElement Переход

Я могу сделать с помощью LINK и B с использованием LINK

2 Вопросы

  1. Могу ли я делать это правильно

  2. Как я совмещаю А и В

После ответов Джорджа

v21/themes.xml

<resources> 
<style name="AppTheme" parent="AppTheme.Base"> 
    <item name="android:windowContentTransitions">true</item> 
    <item name="android:windowAllowEnterTransitionOverlap">true</item> 
    <item name="android:windowAllowReturnTransitionOverlap">true</item> 
    <item name="android:windowSharedElementExitTransition">@transition/exit_slide_transition</item> 
    <item name="android:windowSharedElementEnterTransition">@transition/enter_transition</item> 

</style> 
</resources> 

exit_slide_transition.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds 
     android:duration="1000" 
     android:interpolator="@android:anim/linear_interpolator"/> 
</transitionSet> 

linear.xml (используется AnimationUtils.loadAnimation)

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <translate 
     android:fromYDelta="0" 
     android:toYDelta="45%p" 
     android:fromXDelta="0" 
     android:toXDelta="45%p" 
     android:duration="1000"/> 
</set> 

enter_transition.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeImageTransform/> 
</transitionSet> 

Начало деятельности + moveImage():

//StartActivity: 

    ActivityOptionsCompat options = 
        ActivityOptionsCompat.makeSceneTransitionAnimation(
          activity, transitionView, EXTRA_IMAGE); 
      Intent intent = new Intent(activity, DetailActivity.class); 
      intent.putExtra(EXTRA_IMAGE, url); 
      ActivityCompat.startActivity(activity, intent, options.toBundle()); 

//moveImage(): 

    RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams((int)getResources().getDimension(R.dimen.my_image_dp),(int)getResources().getDimension(R.dimen.my_image_dp)); 
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE); 
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE); 
imageView.setLayoutParams(layoutParams); 

ответ

1

Из того, что я прочитал в ссылки, вы пытаетесь сделать начальную анимацию непосредственно с Animators. Это можно сделать, используя Animator Listener (onAnimationEnd) для запуска Activity, но я предполагаю, что это не то, о чем вы думаете.

«Правильный» способ - использовать SharedElementExitTransition для перемещения представления до перехода на новую активность. Вы можете использовать ChangeTransform или ChangeBounds для перемещения, в зависимости от свойств, которые вы изменяете (перевод или позиция).

По существу:

startActivity(intent, bundle); 
moveImage(); 

Это вызовет переход выхода общего доступа элемента для запуска на основе того, что вы делаете в ходе изображения, чтобы поместить его в конечном положении. Когда он закончится, запущенная активность возьмет его и переместит в свою конечную позицию, используя переход на общий элемент.

Edit:

Похоже, что вам нужно, чтобы заставить макет родительского вида, если вы просто настроить Params макета. Я еще не уверен, почему это необходимо.После вызова setLayoutParams, добавьте это:

View parent = (View) imageView.getParent(); 
    int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY); 
    int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY); 
    parent.measure(widthSpec, heightSpec); 
    parent.layout(parent.getLeft(), parent.getTop(), parent.getRight(), parent.getBottom()); 

Вы также можете уйти только с изменением в ImageView в левый/верх/справа/снизу непосредственно.

+0

SharedElementExitTransition !! что делает полный смысл, спасибо, попробуем это –

+0

, можете ли вы проверить мой обновленный вопрос, теперь я получаю ** RuntimeException: Неизвестное имя интерполятора: set ** –

+1

Интерполятор, на который ссылаются в changeBounds, должен быть @android: anim/linear_interpolator. linear.xml (ссылка в интерполяторе changeBounds) действует как AnimationSet, а не интерполятор. –