13

私の要件は、ビューの合計の高さがリストに許可されている高さよりも大きい場合は常に、スクロールバー付きのビューの垂直リストを表示することです。

さらに、scrollBar の外観 (背景とつまみ) をプログラムでカスタマイズする必要があります。(実行時に、アクティビティはレンダリングを行うためのすべてのデータを受け取ります。スクロールバーの背景として使用するビットマップ、スクロールバーの幅、およびスクロールバーのサムとして使用するビットマップです。)

ListViewscrollBar をプログラムでカスタマイズする方法が見つからないことを除いて、これには良い候補のようです。この質問scrollBar を listView で読みました...カスタマイズしています。しかし、それはテーマを使用しており、プログラムで新しいテーマを作成することはできません。

だから私の質問:

  1. スクロールバー (ListView 内) の外観をプログラムでカスタマイズする方法はありますか?

  2. [最初のものに対する答えが「絶対に不可能」である場合のみ]これらの要件を達成する他の方法はありますか (およびそれを実行するいくつかの実例)

ありがとう。

編集 (23/12)

この隠しクラスを見つけましたandroid.widget.ScrollBarDrawable。ソリューションを構築するための良い出発点になる可能性があります (今すぐ調査する時間はありません)。

4

5 に答える 5

6

スクロールバー (ListView 内) の外観をプログラムでカスタマイズする方法はありますか?

文字通り、それを操作するためのセッターがないという理由だけで、そのようには見えません。

非表示を動的な変更を処理するものに置き換える独自のBenViewサブクラスを作成できると考えられます。ただし、 、、およびを作成し、Ben なしの対応するソース コードを複製して、これらを連鎖させてこの動作を継承させる必要があります。また、、、またはのいずれかは Android リリースで必ず変更されるため、実際にはこれらのクラスの N 個のコピーが必要であり、実行時の API レベルに基づいて適切なコピーを選択します。そして、メーカーが入って、、またはをいじくり回した一部のデバイスでは、アプリがまだ奇妙な動作をする可能性があり、それらのコードを使用することはありません。ViewScrollBarDrawableBenScrollBarDrawableBenViewGroupBenAbsListViewBenListViewBenViewViewGroupAbsListViewListViewViewGroupAbsListViewListView

特にスクロール中以外はデフォルトでスクロールバーが表示されないため、これが価値があるとは思えません。

これらの要件を達成するための他の方法がありますか(およびそれを実行するいくつかの実例)

独自のタッチ イベントを処理して、独自のスクロールと独自のスクロールバー操作を行います。これが上記のソリューションよりも手間がかからないかどうかは、議論の余地があります。

于 2012-12-23T13:16:28.720 に答える
3

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 などの他のビューでも同じ原則が機能するはずです。

于 2016-03-22T11:31:21.173 に答える
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>

これはあなたが望むものだと思います!

于 2012-12-23T10:13:21.000 に答える
-1

これを実現するには、jquery プラグイン (jquery.nicescroll.js) を使用できます。詳細については、http://areaaperta.com/nicescroll/ をご覧 ください。

于 2012-12-28T06:58:44.020 に答える