Индивидуальная настройка ScrollBar
Мои требования состоят в том, чтобы отображать вертикальный список представлений с помощью полосы прокрутки всякий раз, когда общая высота просмотров больше, чем разрешенная высота для списка.
Кроме того, мне необходимо настроить внешний вид scrollBar (фон и большой палец) программно. (Во время выполнения моя активность будет получать все данные для рендеринга: растровое изображение для использования в качестве фона полосы прокрутки, ширины полосы прокрутки и растрового изображения для использования в качестве пальца полосы прокрутки.)
A ListView
кажется хорошим кандидатом для этого, за исключением того, что я не могу найти способ индивидуально настроить scrollBar.
Я прочитал этот вопрос scrollBar в спискеView... его настройке, но, используя тему, и AFAIK невозможно создать новую тему программно.
Итак, мой вопрос (ы):
-
Есть ли способ настроить внешний вид полосы прокрутки (внутри ListView) программно?
-
[только если ответ на первый "окончательно невозможен" ] вы видите какой-либо другой способ достижения этих требований (и некоторый рабочий пример его выполнения).
Спасибо.
EDIT (23/12)
Я нашел этот скрытый класс android.widget.ScrollBarDrawable
. Может быть хорошей отправной точкой для создания решения (нет времени, чтобы исследовать его прямо сейчас).
Ответы
Ответ 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/