Подтвердить что ты не робот

Индивидуальная настройка ScrollBar

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

Кроме того, мне необходимо настроить внешний вид scrollBar (фон и большой палец) программно. (Во время выполнения моя активность будет получать все данные для рендеринга: растровое изображение для использования в качестве фона полосы прокрутки, ширины полосы прокрутки и растрового изображения для использования в качестве пальца полосы прокрутки.)

A ListView кажется хорошим кандидатом для этого, за исключением того, что я не могу найти способ индивидуально настроить scrollBar. Я прочитал этот вопрос scrollBar в спискеView... его настройке, но, используя тему, и AFAIK невозможно создать новую тему программно.

Итак, мой вопрос (ы):

  • Есть ли способ настроить внешний вид полосы прокрутки (внутри ListView) программно?

  • [только если ответ на первый "окончательно невозможен" ] вы видите какой-либо другой способ достижения этих требований (и некоторый рабочий пример его выполнения).

Спасибо.

EDIT (23/12)

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

4b9b3361

Ответ 1

Есть ли способ настроить внешний вид полосы прокрутки (внутри ListView) программно?

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

Можно предположить, что вы можете создать свой собственный BenView подкласс View, который заменяет скрытый ScrollBarDrawable на BenScrollBarDrawable, который обрабатывает динамические изменения. Но тогда вам нужно будет создать BenViewGroup, BenAbsListView и BenListView, клонировав исходный код своих Ben-less-копий, чтобы привязать их к BenView, чтобы наследовать это поведение. И, поскольку один из ViewGroup, AbsListView или ListView обязательно изменится в любой версии Android, вам действительно понадобятся N копий этих классов и выберите правильную копию на основе уровня API во время выполнения. И тогда ваше приложение может по-прежнему вести себя странно на некоторых устройствах, в которых производитель вошел и использовал ViewGroup, AbsListView или ListView, и вы не будете использовать их код.

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

Вы видите какой-либо другой способ достижения этих требований (и некоторый рабочий пример этого)

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

Ответ 2

Я просто столкнулся с той же проблемой для RecyclerView и решил ее как это

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;

/**
 * Created on 22.3.2016.
 *
 * @author Bojan Kseneman
 * @description A recycler view that will draw the scroll bar with a different color
 */
public class CustomScrollBarRecyclerView extends RecyclerView {

    private int scrollBarColor = Color.RED;

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

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

    public CustomScrollBarRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setScrollBarColor(@ColorInt int scrollBarColor) {
        this.scrollBarColor = scrollBarColor;
    }

    /**
     * Called by Android {@link android.view.View#onDrawScrollBars(Canvas)}
     **/
    protected void onDrawHorizontalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) {
        scrollBar.setColorFilter(scrollBarColor, PorterDuff.Mode.SRC_ATOP);
        scrollBar.setBounds(l, t, r, b);
        scrollBar.draw(canvas);
    }

    /**
     * Called by Android {@link android.view.View#onDrawScrollBars(Canvas)}
     **/
    protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) {
        scrollBar.setColorFilter(scrollBarColor, PorterDuff.Mode.SRC_ATOP);
        scrollBar.setBounds(l, t, r, b);
        scrollBar.draw(canvas);
    }
}

Эти методы определены в классе View, поэтому один и тот же принцип должен работать с другими представлениями, такими как ScrollView и ListView.

Ответ 3

Просто измените android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb" и создайте лимит в соответствии с вашими потребностями.

Как

<ListView android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb" /> 

в Drawable:

<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
    <gradient android:angle="0" android:endColor="#6699FF" android:startColor="#3333FF" />
    <corners android:radius="1dp" /> 
    <size android:width="1dp" /> 
</shape>

Я думаю, что это то, что вы хотите!

Ответ 4

Для этого вы можете использовать jQuery-плагин (jquery.nicescroll.js). Подробнее посетите http://areaaperta.com/nicescroll/