2014-01-08 3 views
5

Поэтому у меня есть мнение, которое выглядит следующим образом:Animate ViewPager, чтобы заполнить экран в Android

enter image description here

То, что я пытаюсь добиться для всего представления сдвигаются вверх, чтобы скрыть большие изображения до вершины когда пользователь прокручивается вниз по GridView. В принципе, если они хотят видеть больше gridview, макет прокручивается, чтобы увеличить размер сетки.

Однако, когда я на самом деле сделать это, вот что происходит:

enter image description here

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

Вот как я делаю то, что я до сих пор:

private void hideHeader(boolean animate) { 
    if(animate) { 
     AnimatorSet set = new AnimatorSet(); 
     set.playTogether(
       ObjectAnimator.ofFloat(mImageHeader, "translationY", -mImageHeader.getHeight()), 
       ObjectAnimator.ofFloat(mShareButton, "translationY", -mImageHeader.getHeight()), 
       ObjectAnimator.ofFloat(mIndicator, "translationY", -mImageHeader.getHeight()), 
       ObjectAnimator.ofFloat(mViewPager, "translationY", -mImageHeader.getHeight()) 
     ); 

     set.setDuration(700l); 
     set.start(); 
    } 
    else { 
     //TODO finish 
    } 
} 

Как вы можете сказать из кода, я использую ViewPager. В этом случае GridView на самом деле является фрагментом, в котором я сначала думал, что моя проблема исходит. Однако, это не тот случай, когда ViewPager заполняет экран и фрагмент внутри него нет, а сама ViewPager является то, что не заполнение вниз по вертикали:

enter image description here

Вот XML родителя фрагмент (который содержит большое изображение, Share кнопку и ViewPager + индикатор):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:background="@android:color/white" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

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

    <include android:id="@+id/fp_image_header" 
      layout="@layout/widget_image_header" 
      android:layout_below="@id/fp_abf"/> 

    <TextView android:id="@+id/fp_share_button" 
       android:layout_width="match_parent" 
       android:layout_height="60dp" 
       android:layout_below="@id/fp_image_header" 
       android:gravity="center" 
       android:background="@drawable/selectable_action_button_grey_to_bit_green" 
       android:textSize="14dp" 
       android:textColor="@android:color/white" 
       android:text="@string/share_caps"/> 

    <com.viewpagerindicator.TabPageIndicator android:id="@+id/fp_indicator" 
              android:layout_width="match_parent" 
              android:layout_height="wrap_content" 
              android:layout_below="@+id/fp_share_button" 
              android:background="@color/header_background"/> 

    <android.support.v4.view.ViewPager android:id="@+id/fp_pager" 
             android:layout_width="match_parent" 
             android:layout_height="match_parent" 
             android:layout_below="@id/fp_indicator"/> 

</RelativeLayout> 

Я первоначально имел это как LinearLayout, но пытался переключить его на Относительный видеть, если это будет делать какие-либо разницы (это Бесполезный «т).

Как вы можете видеть, ViewPager имеет layout_height из "match_parent", который, как я думал, будет достаточным для заполнения всего пространства, которое у него есть. Я думаю, что происходит то, что мнение не уведомляется о том, что у него больше места для работы и, следовательно, перерисовки его границ, но я не уверен, как его запускать.

Кто-нибудь знает, как это сделать (или лучший метод для достижения того, чего я хочу)? Спасибо за прочтение.

+0

Вашего метод не плохо, но то, что вы можете сделать, это написать пользовательский Аниматор для обработки LayoutParams, изменяя высоту соображений и а не их положение. Таким образом, большое изображение идет от текущей высоты до 0, а ViewPager - от текущей высоты до + высоты большого изображения. Возможно, потребуется вызвать ретранслятор во время анимации. – Tom

+0

@Tom Я думал об использовании функции scaleY в ViewPager, но проблема в том, что, как растягивает представление, а не увеличивает его границы. Я также попытался сделать viewPager.invalidate() после завершения анимации, но это тоже не сработало. – JMRboosties

+1

Я не имел в виду «scaleY», я имел в виду пользовательский Animator, который фактически изменил свойство «LayoutParams.height». Проверьте это: http://stackoverflow.com/questions/7902976/objectanimator-animate-lingleayout-width – Tom

ответ

0

Я понял. Есть две вещи, которые необходимо выполнить:

1) Добавьте метод, который вручную сбрасывает параметры макета ViewPager на нужную высоту. Если у вас есть метод, назовем его в onAnimationStart метод слушателя анимации в в .Это выглядит примерно так для меня:

private void hideAnimationStart() { 
    int containerHeight = mContainer.getHeight(); 
    int shareHeight = mShareButton.getHeight(); 
    int indicatorHeight = mIndicator.getHeight(); 

    int newHeight = containerHeight - (shareHeight + indicatorHeight); 

    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mViewPager.getLayoutParams(); 
    params.height = newHeight; 

    mViewPager.setLayoutParams(params); 
} 

В принципе измерения пространства, я хочу, чтобы это принять.

2) Вам также необходимо изменить родительский тип макета на LinearLayout вместо RelativeLayout. Я не знаю, почему работает только Linear, но, похоже, это так.

Я также включу метод, который я использовал, чтобы вернуть представление в исходное состояние.В этом случае, этот метод вызываются в слушателе набора анимация в-х onAnimationEnd:

private void showAnimationEnd() { 
    int containerHeight = mContainer.getHeight(); 
    int shareHeight = mShareButton.getHeight(); 
    int indicatorHeight = mIndicator.getHeight(); 
    int imageHeight = mImageHeader.getHeight(); 

    int newHeight = containerHeight - (shareHeight + indicatorHeight + imageHeight); 

    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mViewPager.getLayoutParams(); 
    params.height = newHeight; 

    mViewPager.setLayoutParams(params); 
} 
Смежные вопросы