2014-10-22 1 views
3

Я использовал код в Google IO репо: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.javaAnimate содержание, когда скрывается ActionBar/панель

Я пытаюсь скрыть панель при прокрутке и он прекрасно работает, но моя проблема в том, что моя главная контент остается фиксированным, когда панель инструментов анимируется вне экрана.

код, который запускает анимацию на R.id.toolbar_actionbar является:

view.animate() 
     .translationY(-view.getBottom()) 
     .alpha(0) 
     .setDuration(HEADER_HIDE_ANIM_DURATION) 
     .setInterpolator(new DecelerateInterpolator()); 

Я попытался положить панель внутри LinearLayout с содержанием, но это ничего не меняет. Только если я установил панель действия на видимость = ушел, содержимое будет двигаться вверх.

Кто-нибудь знает, что я должен сделать, чтобы сделать анимированный контент вместе с трансляционной анимацией панели инструментов?

В основном вопрос сводится к следующему: как я могу анимировать положение одного вида и сделать другие представления живыми вместе с ним?

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

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <include 
     android:id="@+id/toolbar_actionbar" 
     layout="@layout/toolbar_actionbar" /> 

    <FrameLayout 
     android:id="@+id/main_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/adsContainer" 
     android:layout_below="@+id/toolbar_actionbar" /> 

    <LinearLayout 
     android:id="@+id/adsContainer" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:background="#000000" 
     android:orientation="horizontal" /> 
</RelativeLayout> 
<!-- The navigation drawer --> 

<ExpandableListView 
    android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#111" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" /> 

</android.support.v4.widget.DrawerLayout> 

ответ

7

Вы можете использовать этот небольшой фрагмент кода для анимации высоты открывается вид в:

public void animateHeight(final View view, int from, int to, int duration) { 
    ValueAnimator anim = ValueAnimator.ofInt(from, to); 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      int val = (Integer) valueAnimator.getAnimatedValue(); 
      ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
      layoutParams.height = val; 
      view.setLayoutParams(layoutParams); 
     } 
    }); 
    anim.setDuration(duration); 
    anim.start(); 
} 

Вызов это будет выглядеть примерно так:

View view = findViewById(R.id.view); 
// Wait for layout to be drawn before measuring it 
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View view, int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8) { 
     view.removeOnLayoutChangeListener(this); 
     animateHeight(view, view.getHeight(), 0, 5000); 
    } 
}); 
+0

Спасибо! Мне удалось это сделать и с (API-уровень 16): LayoutTransition trans = ((RelativeLayout) findViewById (R.id.wrapper)). GetLayoutTransition(); trans.enableTransitionType (LayoutTransition.CHANGING); А затем установите высоту.Но действительно хотелось бы знать, где волшебство в коде IO Google, что заставляет это работать. –

+0

@ChristerNordvik находится внутри пакетов appwidget. У них есть пользовательские классы, чтобы делать эти вещи. – k0sh

+0

Хотя это работает, это дало мне очень грубый переход, ища более плавную работу. благодаря – ElliotM

1

Я также имел ту же самую проблему содержания пребывания где он был даже после того, как панель действий (виджет панели инструментов appcompat v7) скользит, когда прокручивается просмотр списка.

Последующая схема Christer для макета деятельности.

Это может быть грязное исправление или, может быть, я испортил свои макеты. Но все же размещайте здесь, чтобы получить лучшие решения. Так вот:

Содержимое (макет фрагмента) корневой элемент был такой:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main_content_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?attr/actionBarSize" > 
............ 

И моя раскладка деятельности выглядит следующим образом:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <include 
     android:id="@+id/toolbar_actionbar" 
     layout="@layout/action_bar" /> 
</RelativeLayout> 
.........other stuff......... 

Грязное исправление было ввести поддельную панель инструментов в макете Фрагмента и держать ее сверху.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main_content_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

<View 
    android:id="@+id/fakeToolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:layout_alignParentTop="true" /> 

.............Other elements like ListView/GridView below this........ 

И в OnScroll метод делает fakeToolbar видимым/невидимым вместе с фактической ToolBar скольжения вверх/вниз:

mToolbar.animate().translationY(0).alpha(1) 
      .setDuration(HEADER_HIDE_ANIM_DURATION) 
      .setInterpolator(new DecelerateInterpolator()).withStartAction(new Runnable() { 

       @Override 
       public void run() { 
        fakeToolbar.setVisibility(View.VISIBLE);       
       } 
      });  

Это исправление дал плавный переход к макету во время прокрутки.