Вопрос по android, android-viewpager – визуальная индикация более прокрутки в Android

10

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

Я попытался расширить класс ViewPager с помощью следующего кода, но Toast не отображается (ev.getOrientation() возвращает всегда 0). Я также пробовал то же самое с историческими точками, ноev.getHistorySize() также возвращает 0.

Что мне не хватает?

Пример класса:

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * @see android.support.v4.view.ViewPager#onTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);

        switch (ev.getAction() & MotionEventCompat.ACTION_MASK) {
            case MotionEvent.ACTION_MOVE:
                if (ev.getOrientation() > 0) {
                    Toast.makeText(getContext(), "left", 0).show();
                }
        }

        return result;
    }
}

Ваш Ответ

8   ответов
7

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

Но затем я изо всех сил пытаюсь реализовать то, что звучало довольно просто из ответа. У меня было так много проблем с его реализацией, что, возможно, я не правильно понял ответ, но было слишком много проблем с недоступными API, поскольку я не работал в одном пакете библиотеки совместимости.

После того, как я попробовал несколько подходов (ни один из них не удался, и они были довольно сложными), я пошел в несколько ином направлении, и теперь это работает как шарм. Я использовал некоторое отражение, для тех, кто никогда не использовал его, не волнуйтесь, это действительно основа отражения.

Я не уверен, является ли это лучшим решением, но оно сработало для меня, поэтому, если вы хотите его использовать, пожалуйста. Пожалуйста, прочитайте пример Wnafee, так как он объясняет некоторые вещи, которые я сделал.

Чтобы выполнить эту задачу, вы должны просто следовать моему решению из трех частей. (Займет у вас 3-10 минут)

Part I:

Как сказал Wnafee, я только что создал свой собственный класс EdgeEffect, скопировав и вставив исходный код изВот,

(just make sure to copy the overscroll_edge and overscroll_glow drawables in the AOSP /res/drawable directories to your own project since they are internal to android)

Я сделал только 2 действительно небольших изменения:

I declare that the class extends EdgeEffectCompat (I called my class EdgeEffectForEarlyVersions). public class EdgeEffectForEarlyVersions extends EdgeEffectCompat. The reason for doing this change is that the mLeftEdge and mRightEdge are of the type EdgeEffectCompat. At the first line of the constructor of "my" new class I added a call to the parent constructor super(context);. Since there is no default constructor to EdgeEffectCompat you have to Explicitly call the constructor.

Part II

Помимо этого я написал еще одну функцию. Цель функции заключается в том, что в случае более ранней версии (до ICS) мы хотели бы использоватьEdgeEffectForEarlyVersions что мы только что скопировали. Чтобы достичь этой цели, я использовал отражение.

Это функция:

private static void changeEdgeEffectCompactOnEarlyVersions(ViewPager viewPager, Context context)
{
    /* In case that the version is earlier than 14 there is only empty implementation for the edge effect, therefore we change it.
     * for more information look on the following links:
     * 1. http://stackoverflow.com/questions/10773565/visual-indication-of-over-scroll-in-android
     * 2. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/view/ViewPager.java#ViewPager.0mLeftEdge
     * 3. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/widget/EdgeEffectCompat.java#EdgeEffectCompat
     */

    if (Build.VERSION.SDK_INT < 14)
    {
        try
        {
            Class<ViewPager> viewPagerClass = ViewPager.class;
            //Get the left edge field, since it is private we used getDeclaredField and not getDeclared 
            Field leftEdge = viewPagerClass.getDeclaredField("mLeftEdge");
            leftEdge.setAccessible(true);
            //Get the right edge field, since it is private we used getDeclaredField and not getDeclared
            Field rightEdge = viewPagerClass.getDeclaredField("mRightEdge");
            rightEdge.setAccessible(true);

            EdgeEffectForEarlyVersions leftEdgeEffect = new EdgeEffectForEarlyVersions(context);
            EdgeEffectForEarlyVersions rightEdgeEffect = new EdgeEffectForEarlyVersions(context);

            //Set the mLeftEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect  
            leftEdge.set(viewPager, leftEdgeEffect);
            //Set the mRightEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
            rightEdge.set(viewPager, rightEdgeEffect);              
        }
        catch (Exception ex)
        {
            Log.e("refelection", ex.getMessage());
        }

    }
}

Part III

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

Надеюсь, это кому-нибудь поможет.

Error: User Rate Limit Exceeded
19

то увидите, что класс, используемый ViewPager, называетсяEdgeEffectCompat (это обеспечивает эффект свечения, когда вы достигаете начала или конца пейджера представления в ICS +). Если вы посмотрите на реализацию в библиотеке compat, вы увидите, что в ней есть оператор if, чтобы увидеть, является ли версия сборки 14+ ( ICS) или нет. Если это так, то это в конечном итоге (если вы отслеживаете достаточно долго), используя обычныйEdgeEffect класс, который был введен в ICS. В противном случае он использует BaseEdgeEffectImpl, который в принципе ничего не имеет.

Если вы хотите, вы можете создать свой собственный ViewPager, который использует EdgeEffect. Вы можете посмотреть на исходный код Android, чтобы увидеть, как они реализовали EdgeEffect.Вот который вы можете в значительной степени скопировать (просто обязательно скопируйтеoverscroll_edge а такжеoverscroll_glow drawables в каталогах AOSP / res / drawable для вашего собственного проекта, так как они являются внутренними для Android), или создайте свою собственную версию.

Удачи.

(Между прочим, именно так они создают крутой эффект наклона края в меню панели запуска на ICS ... так что вы можете в значительной степени проявить креативность так, как вам хочется;)

Error: User Rate Limit Exceeded
-1

PagerAdapter такие какFragmentPagerAdapter или жеFragmentStatePagerAdapter залить ViewPager с содержимым (your content are going to be views).

Теперь, когда вы используетеPagerAdapter, у вас есть один метод с именемgetCount(), http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getCount%28%29 , который даст вам размер контента.

Поскольку вы теперь знаете размер, вы можете легко отобразить сообщение с оператором if.

Попробуйте этот код:http://developer.android.com/reference/android/support/v4/view/ViewPager.html

Примечание: я не думаю, что вам нужен собственный ViewPager. Вам также нужно будет понять фрагменты для ViewPager. Посмотрите на образцы в ApiDemos. Это отличный источник.

Error: User Rate Limit Exceeded
0

гментах. Псевдокод:

    void setUserVisibleHint(boolean isVisibleToUser) {
        // If this fragment is becoming visible
        if (isVisibleToUser == true) {
             // Check if it is the last fragment in the viewpager
             if (indexOfThis == getActivity().indexOfLast) {
                // Display right limit reached
                Toast(..., "No more Frags to right",...)
                }
             // Check if it is the first fragment in the viewpager
             else if (indexOfThis == getActivity().indexOfFirst) {
                // Display Left Limit reached
                Toast(..., "No more Frags to left",...)
             }
        }
    }

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

Error: User Rate Limit Exceeded
1

вы можете показать тост, отобразить диалог, сделать TextView или изображение для отображения поверх вашего пользовательского интерфейса и т. Д. Или, поскольку вы знаете количество элементов View в ViewPager, вы можете добавить другой View в позиции 0 и / или n + 1 с сообщением и заставьте его отскочить к последнему представлению, которое фактически содержит ваши данные.

Вы могли бы реализовать:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    public void onPageSelected(int position) {
        //TODO If position is the 0 or n item, add a view at 0 or at n+1 to indicate there is no more pages with data.
    }

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // TODO Show a Toast, View or do anything you want when position = your first/last  item;
    }

    public void onPageScrollStateChanged(int state) {
    }
});
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

но для ленивых среди нас я сделал реальную рабочую реализацию довольно давно.

https://github.com/inovex/ViewPager3D

И если вы просто хотите оверролл, посмотрите здесь:

https://github.com/inovex/ViewPager3D/issues/1

0
1

когда вы создаете свой собственный класс EdgeEffect и вы расширяете класс EdgeEffectCompat, некоторые методы должны быть логическими. вы можете поменять эти методы на булевы типы и заставить потом возвращать true в любом случае, таким образом все работает нормально

,

Похожие вопросы