2015-02-27 3 views
1

Я использую https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabLayout.java tabs класс.Как центрировать SlidingTabStrip как на игровом рынке?

После нанесения его на мой проект, я не получаю (не сосредоточенные) вкладки, как показано this picture, но я хочу, чтобы центр мои вкладки, как на Play Market закладках.

Как разместить мои вкладки, как в приложении Google Play, спасибо?

+0

Возможный дубликат [Активная вкладка Android TabHost Center] (http://stackoverflow.com/questions/9878785/android-tabhost-center-active-tab) – tachyonflux

+0

@karaokyo его вполне очевидно, что его не дубликат: D – edwinj

+0

@AndreyLaw Не могли бы вы показать код, который вы использовали? Все, что я мог сделать сейчас, это дать вам ссылку на хороший учебник - http://www.exoguru.com/android/material-design/navigation/android-sliding-tabs-with-material-design.html – edwinj

ответ

0

Измените метод scrollToTab, чтобы центрировать выбранную вкладку.

private void scrollToTab(int tabIndex, int positionOffset) { 
    final int tabStripChildCount = mTabStrip.getChildCount(); 
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { 
     return; 
    } 

    View selectedChild = mTabStrip.getChildAt(tabIndex); 
    if (selectedChild != null) { 
     int viewWidth = getWidth(); 
     int tabWidth = selectedChild.getWidth(); 
     int tabPosition = selectedChild.getLeft() + positionOffset; 
     int targetScrollX = tabPosition - viewWidth/2 + tabWidth/2; 

     scrollTo(targetScrollX, 0); 
    } 
} 
+0

Спасибо, но немного не плавно , После того как вкладка получит центральное положение, вкладка немного сдвинется влево (или вправо). [Проверить видео] (http: // tinypic.com/r/sy4as7/8) –

+0

Вы говорите мне, что это не делалось, прежде чем вы внесли изменения? Это, кажется, проблема с логикой анимации, к которой я не прикасался и не смотрел, поскольку это не имеет никакого отношения к вашему первоначальному вопросу. – tachyonflux

+0

Вы не правы - анимация перед изменением будет хорошей. Теперь я использую эту библиотеку https://github.com/jpardogo/PagerSlidingTabStrip См. Экран: все нормально :) https://raw.githubusercontent.com/jpardogo/PagerSlidingTabStrip/master/art/material_tabs.gif Анимация, центрирование - все нормально. –

0

Ваш файл activity_main.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:orientation="vertical" 
    tools:context=".MainActivity"> 

<samples.exoguru.materialtabs.SlidingTabLayout 
    android:id="@+id/tabs" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:elevation="2dp" 
    android:background="@color/ColorPrimary"/> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:layout_weight="1"> 
</android.support.v4.view.ViewPager> 

я не знаю ничего, что могло бы пойти не так.

enter image description here

+0

Я думаю, что вы меня совершенно не понимаете, и у вас есть только 2 вкладки, КАК 2 TABS МОЖЕТ ЦЕНТР НА ЭКРАНЕ. Вот мой массив строк <строка-массив имен = "Вкладки"> Категории Главная Топ платных Топ платных Топ бесплатных Бестселлеры Топ новых платных Топ новые бесплатные Набирающие популярность

+0

Создайте все вкладки из массива строк и попробуйте центральные вкладки, как показано на экране и на видео ... Ваш макет ничего не имеет значения для моей проблемы ... Макет хорошо, SlidingTabLayout.java - НЕ ХОРОШО. У вас есть только 2 вкладки - создайте дополнительные вкладки –

1

Я потратил немного времени на это и недавно получил это работает. Вот резюме.

SlidingTabLayout.java Вы должны изменить метод scrollToTab, чтобы вычислить правильный свиток. Я добавил пояснительные комментарии здесь:

private void scrollToTab(int tabIndex, float positionOffset) { 
    final int tabStripChildCount = mTabStrip.getChildCount(); 
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { 
     return; 
    } 

    View selectedChild = mTabStrip.getChildAt(tabIndex); 
    View nextChild = mTabStrip.getChildAt(tabIndex + 1); 
    if (selectedChild != null) { 
     // c1 is the center of the currently selected tab 
     int c1 = selectedChild.getLeft() + (selectedChild.getWidth()/2); 

     // viewCenter is the center of the parent view 
     int viewCenter = getWidth()/2; 

     int targetCenter = c1; 
     if (nextChild != null) { 
      // c2 is the center of the tab to the right of the currently selected 
      int c2 = nextChild.getLeft() + (nextChild.getWidth()/2); 

      // the 'targetCenter' is partway between c1 & c2 depending on how far the viewpager 
      // is currently scrolled 
      targetCenter = (int) (c1 + ((c2 - c1) * positionOffset)); 
     } 

     int targetScrollX = targetCenter - viewCenter; 

     scrollTo(targetScrollX, 0); 
    } 
} 

Обратите внимание, что это изменило аргумент positionOffset от int к float, это преднамеренно, мы больше не можем использовать исходное значение передается из InternalViewPagerListener «s onPageScrolled поскольку он не учитывал ширину следующей вкладки. Это означает, что в этом методе onPageScrolled мы должны изменить:

 View selectedTitle = mTabStrip.getChildAt(position); 
     int extraOffset = (selectedTitle != null) 
       ? (int) (positionOffset * selectedTitle.getWidth()) 
       : 0; 
     scrollToTab(position, extraOffset); 

быть:

 scrollToTab(position, positionOffset); 

Это дает нам доступ к необработанным positionOffset парам, что нам нужно сделать правильный расчет.

Это единственные необходимые изменения. Я разместил здесь полный класс: https://gist.github.com/danh32/c39465c8b04db059fe72

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