8

いくつかの長方形を描画してメソッドListViewを拡張するカスタムがあるとします。onDraw()

class Listpicker extends ListView {
//..Some other methods here..//
    @Override
    protected void onDraw(android.graphics.Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint);
    }
}

描画されたビットマップは、幅がリストビューの幅に等しく、高さがいくらかの長方形であるある種のグラスを表しています。私が望むのは、リスト項目がこの長方形にスクロールすると、テキストの描画に使用される色 (背景などを持つすべての項目ではない) が別の色に変更されることです。したがって、たとえば、テキストの半分の高さだけが に収まるようにリスト項目が収まる場合、リスト項目glassPickerBitmapの外側の部分は序数の色のままにし、内側の部分はglassPickerBitmapテキストの色を変更する必要があります。リスト項目は背景のないシンプルな TextView です。

これはどのように達成できますか?に割り当てColorFilterられている可能性がありPaintますか?しかしここで?onDraw()のメソッドは、スクロールさListviewれたときにも呼び出されませんListView...たとえば、カスタマイズされたビュー内でこれを実行できますか?それはListViewのアイテムになりますか? または、いくつかのカラー/シェーダー/ここで使用できるオーバーレイを他に知らないかもしれませんが、どこで?

編集(画像の例を追加):

これは、実際のアプリからの切り抜きの例です。2 つListViewの s があります。1 つは左側、もう 1 つは右側です。ガラスは灰色の長方形です。現在、左のリストでは「米ドル」通貨が選択されています。ListViewその選択はUSDAfghan Afghaniの間のどこかにあります。さて、私が欲しいのは、左側の米ドル通貨がListView赤で描かれることです(正確な色は今は重要ではありません。後で意味のあるものに変更します)と同時に、「米ドル」の下の部分」と右側の ListView の「Afghan Afghani」の上部も同じ赤色で描画されます。

この色の変更は動的な方法で行う必要があります。色は、リストのスクロール中にガラスの長方形の下にあるテキストの部分に対してのみ変更する必要があります。

*OK、EUR および USD は、標準のシアン色ではない特別な通貨です。質問は、少なくとも白い色のテキストについてです。しかし、シアン色も変更できれば最高です。

リストの例

4

2 に答える 2

1

まず、予備のビットマップとキャンバスを保持します。

class Listpicker extends ListView {
    Bitmap bitmapForOnDraw = null;
    Canvas canvasForOnDraw = null;

適切なサイズであることを確認してください。

    @override
    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
        if (bitmapForOnDraw != null) bitmapForOnDraw.recycle();
        bitmapForOnDraw = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvasForOnDraw = new Canvas(bitmapForOnDraw);
    }

リストを描画するときは、次のようにします。

    @override
    protected void onDraw(android.graphics.Canvas realCanvas) {
        // Put the list in place
        super.onDraw(realCanvas);

        // Now get the same again
        canvasForOnDraw.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
        super.onDraw(canvasForOnDraw);
        // But now change the colour of the white text
        canvasForOnDraw.drawColor(0xffff00ff, PorterDuff.Mode.MULTIPLY);

        // Copy the different colour text into the right place
        canvas.drawBitmap(bitmapForOnDraw, glassRect, glassRect overwritePaint);

        // finally, put the box on.
        canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint);
    }
于 2013-07-14T17:02:32.910 に答える