以编程方式自定义ScrollBar

我的要求是,只要视图的总高度大于列表的允许高度,就会显示带有滚动条的垂直视图列表。

另外,我需要以编程方式自定义scrollBar外观(背景和拇指)。 (在运行时,我的活动将接收进行渲染的所有数据:用作滚动条背景的位图,滚动条宽度和用作滚动条拇指的位图。)

ListView似乎是一个很好的选择,除了我找不到以编程方式自定义scrollBar的方法。 我在listView中读了这个问题scrollBar …自定义它。 但是,它正在使用一个主题,而AFAIK则不可能以编程方式创建一个新主题。

所以我的问题:

  1. 有没有办法以编程方式自定义滚动条(在ListView中)的外观?

  2. [只有当第一个答案是“明确不可能”时]你是否看到任何其他方式来实现这些要求(以及一些实际的例子)

谢谢。

编辑(23/12)

我发现这个隐藏的类android.widget.ScrollBarDrawable 。 可能是构建解决方案的良好起点(现在没时间对其进行调查)。

有没有办法以编程方式自定义滚动条(在ListView中)的外观?

从字面上看,它看起来并不像,只是因为没有用于操纵它的制定者。

可以想象,您可以创建自己的ViewBenView子类,用处理动态更改的BenScrollBarDrawable替换隐藏的ScrollBarDrawable 。 但是你需要创建BenViewGroupBenAbsListViewBenListView ,克隆他们的Ben-less对应的源代码,让他们链接到BenViewinheritance这种行为。 而且,由于ViewGroupAbsListViewListView一个必须在任何Android版本中更改,您实际上需要N个这些类的副本,并在运行时根据API级别选择正确的副本。 然后你的应用程序在制造商进入并使用ViewGroupAbsListViewListView修补的某些设备上仍然可能会出现奇怪的行为,并且您将不会使用他们的代码。

我怀疑这是值得的,特别是因为除了滚动时,默认情况下滚动条不可见。

你看到任何其他方式来实现这些要求(和一些工作的例子)

处理您自己的触摸事件以进行自己的滚动并执行自己的滚动条。 这是否比上述解决方案更少的工作是有争议的。

我刚刚遇到了与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类中定义,因此相同的princible应该适用于其他视图,如ScrollView和ListView。

只需更改android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"并根据需要创建一个drawable。

喜欢

  

在Drawable中:

      

我想这就是你想要的!

您可以使用jquery插件(jquery.nicescroll.js)来实现此目的。 更多详情,请访问http://areaaperta.com/nicescroll/