Изменить светлый цвет HorizontalScrollView - OverScrollMode - PullRequest
1 голос
/ 27 декабря 2011

В конце HorizontalScrollView появляется индикатор, показывающий, что содержимое прокрутки закончилось. Есть ли способ изменить этот цвет? Он появляется в моем телефоне как желтый. Я уже установил цвет фона HorizontalScrollView на тот, который мне нужен, но этот свет "конца прокрутки" не тот, который я хочу.

EDIT: Я только что заметил, что этот свет появляется из-за onOverScrollMode (начиная с уровня API 9 - см. эту ссылку ). Есть ли способ установить OVER_SCROLL_NEVER, а также сохранить совместимость с версиями Eclair? Или даже лучше: установить цвет этого света (если он появляется)?

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

К сожалению, не существует простого способа установить цвет для OverScroll EdgeEffect.

Чтобы безопасно установить OVER_SCROLL_NEVER и оставаться совместимым с ранними версиями SDK, вы можете проанализировать метод setOverScrollMode и, если он найден, вызвать его.(проверено на 3.1 и 2.2)

    setContentView(R.layout.main);

    // find scroll view         
    HorizontalScrollView hscroll = (HorizontalScrollView)findViewById(R.id.hscroll);
    try {
        // look for setOverScrollMode method
        Method setOverScroll = hscroll.getClass().getMethod("setOverScrollMode", new Class[] { Integer.TYPE } );

        if (setOverScroll != null) {
            try {
              // if found call it (OVER_SCROLL_NEVER == 2)
              setOverScroll.invoke(hscroll, 2);
            } catch (InvocationTargetException ite) {       
            } catch (IllegalAccessException ie) {
            }               
        }
        } catch (NoSuchMethodException nsme) {          
    }
1 голос
/ 20 января 2015

Вы можете установить цвет EdgeEffect, используя отражение. Из API 14 + будет работать следующее:

public static void setEdgeGlowColor(final HorizontalScrollView hsv, final int color) {
    try {
        final Class<?> clazz = HorizontalScrollView.class;
        for (final String name : new String[] {
                "mEdgeGlowLeft", "mEdgeGlowRight"
        }) {
            final Field field = clazz.getDeclaredField(name);
            field.setAccessible(true);
            setEdgeEffectColor((EdgeEffect) field.get(hsv), color);
        }
    } catch (final Exception ignored) {
    }
}

public static void setEdgeEffectColor(final EdgeEffect edgeEffect, final int color) {
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            edgeEffect.setColor(color);
            return;
        }
        final Field edgeField = EdgeEffect.class.getDeclaredField("mEdge");
        edgeField.setAccessible(true);
        final Field glowField = EdgeEffect.class.getDeclaredField("mGlow");
        glowField.setAccessible(true);
        final Drawable mEdge = (Drawable) edgeField.get(edgeEffect);
        final Drawable mGlow = (Drawable) glowField.get(edgeEffect);
        mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mEdge.setCallback(null); // free up any references
        mGlow.setCallback(null); // free up any references
    } catch (final Exception ignored) {
    }
}
1 голос
/ 10 апреля 2012

Хотя на этот вопрос уже был дан ответ, я хотел бы добавить еще пару способов настройки атрибута overScrollMode.

1) Создайте папку layout-v10 и поместите альтернативный макет xml с атрибутом overScrollMode, установленным по желанию.

2) Если # 1 будет означать копирование тонны файлов и дублирование, вы также можете создать стиль для HorizontalScrollView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...