2

タイル化されたビットマップを使用してビューの背景を設定したいのですが、タイル化を左上隅 (デフォルト) ではなく、左下に固定する必要があります。たとえば、タイルが下のスマイリー フェイスの場合、次のように並べて表示します。

ここに画像の説明を入力

xml ドローアブルを使用すると、タイリング ( を使用tileMode="repeat") またはボトム ポジショニング ( を使用)gravity="bottom"のいずれかを実現できますが、両方を組み合わせることはできません。

アンドロイド:タイルモード

キーワード。タイル モードを定義します。タイル モードが有効な場合、ビットマップが繰り返されます。タイル モードが有効な場合、重力は無視されます。

内部的にはサポートされていませんが、おそらくカスタム ビューを使用して、これを実現する方法はありますか?

4

3 に答える 3

5

別の方法は、メソッドを拡張BitmapDrawableしてオーバーライドすることです。paint()

このメソッドでは、ビューのサイズを持つ新しいビットマップを作成することを避けます。

class MyBitmapDrawable extends BitmapDrawable {
    private Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
    private boolean mRebuildShader = true;
    private Matrix mMatrix = new Matrix();

    @Override
    public void draw(Canvas canvas) {
        Bitmap bitmap = getBitmap();
        if (bitmap == null) {
            return;
        }

        if (mRebuildShader) {
            mPaint.setShader(new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT));
            mRebuildShader = false;
        }

        // Translate down by the remainder
        mMatrix.setTranslate(0, getBounds().bottom % getIntrinsicHeight());
        canvas.save();
        canvas.setMatrix(mMatrix);
        canvas.drawRect(getBounds(), mPaint);
        canvas.restore();
    }
}

次のようにビューに設定できます。

view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap()));
于 2012-03-22T02:01:28.060 に答える
1

ちょっと考えただけで、かなり回りくどいですが、画像を垂直方向に反転させてから、背景に変換を適用して、それを垂直方向にも反転させることはできます?

于 2012-03-21T08:41:58.330 に答える
1

カスタム ビューを使用すると、背景画像だけでなく、すべての描画を自分で処理する必要がある場合があります。

代わりに、次のようにビューの背景をプログラムで設定することを提案します。

// This drawable refers to an image directly and NOT an XML
BitmapDrawable smiley = (BitmapDrawable) getResources().getDrawable(R.drawable.smiley);

// Create a new bitmap with the size of the view
Bitmap bgBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bgBitmap);

// Translate down by the remainder
Matrix matrix = new Matrix();
matrix.setTranslate(0, view.getHeight() % smiley.getIntrinsicHeight());
canvas.setMatrix(matrix);

// Tile the smileys
Paint paint = new Paint();
paint.setShader(new BitmapShader(smiley.getBitmap(), TileMode.REPEAT, TileMode.REPEAT));
canvas.drawPaint(paint);

view.setBackgroundDrawable(new BitmapDrawable(bgBitmap));

考慮すべき点:

  • view.getWidth() & view.getHeight() が寸法を取得する正しい方法であるかどうかはわかりません。
  • スマイリーのサイズがビューよりも大きい場合はどうなりますか?
于 2012-03-21T23:59:41.393 に答える