2012-12-14 19 views
13

我的要求是在視圖的總高度大於列表的允許高度時,用滾動條顯示垂直的視圖列表。以編程方式自定義滾動條

此外,我需要以編程方式自定義scrollBar外觀(背景和拇指)。 (在運行時,我的活動將接收所有數據以進行渲染:用作滾動條背景的位圖,滾動條寬度和用作滾動條大拇指的位圖。)

A ListView似乎是一個很好的選擇,除了我找不到以編程方式自定義scrollBar的方法。 我讀過這個問題scrollBar in a listView...customizing it.但是,它使用的是一個主題,而AFAIK不可能以編程方式創建一個新的主題。

所以我的問題(S):

  1. 有(一個ListView內)編程,可以自定義滾動條的外觀?

  2. [只有在回答第一個是「明確不可能」]你看到任何其他的方式來實現這些要求(和做的一些工作示例)

感謝。

EDIT(23/12)

我發現這個隱藏類android.widget.ScrollBarDrawable。建立一個解決方案可能是一個很好的起點(沒時間現在調查它)。

回答

6

有沒有一種方法來自定義滾動條(在ListView中)的外觀編程?

從字面上看,它看起來不像它,只是因爲沒有設置器來操縱它。

可以想象,您可以創建自己的BenView的子類View,該子類用處理動態更改的BenScrollBarDrawable取代隱藏的ScrollBarDrawable。但是,您需要創建BenViewGroupBenAbsListViewBenListView,克隆它們的無本機對應的源代碼,使它們鏈接到BenView以繼承此行爲。而且,由於ViewGroup,AbsListViewListView之一在任何Android版本中都會發生變化,您實際上需要這些類的N個副本,並在運行時根據API級別選擇正確的副本。然後,您的應用可能會在某些設備上出現異常情況,這些設備上的製造商進入並使用ViewGroupAbsListViewListView進行修飾,您將不會使用它們的代碼。

我懷疑這是值得的,特別是因爲滾動條默認情況下不可見,除了滾動時。

你看到任何其他的方式來實現這些要求(和做的一些工作示例)

處理自己的觸摸事件做自己的滾動和做自己的滾動條的東西。這是否比上述解決方案的工作量少,這是需要辯論的。

0

只需更改android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb" 並根據需要創建繪圖。

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

在繪製對象:

<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> 

我想這是你想要的!

+0

對不起,但我認爲你不明白這個問題:我需要以編程方式不使用靜態xml。 – ben75

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); 
    } 
} 

這些方法在視圖類中定義,所以同樣princible應該工作的像滾動型和ListView其他視圖。

+0

它正在將滾動擴展到match_parent。 –

+0

你是說滾動條和父母一樣寬嗎? –