7

長方形に沿ってビットマップを描画しようとしていますが、どうすればよいかわかりません。ペイント プロパティなどを使用して、Rect オブジェクトに沿ってビットマップを並べて表示する方法はありますか? 私は見ましたが、必要なことを行うものは何も見つかりません。ほとんどのタイル オプションは特定のインスタンスに対してタイルを表示せず、画面全体にタイルを表示するため、そのビットマップを使用するすべてが終了しますスクロールも何もせずに、同時にそれらすべてに沿って 1 つの大きなビットマップ タイリングを作成します。

何か案は?さらに情報が必要な場合はお知らせください。これは奇妙な質問なので、重要なことについて言及していない可能性があります。

ウィリアム

4

2 に答える 2

13

これを攻撃する方法はいくつかあります。ここではそのうちの 2 つについて説明します...

一方通行:

Bitmap の周囲にBitmapDrawableを定義できます。その TileMode を繰り返すように設定します。rect が Rect インスタンスである setBounds(rect) を介していくつかの境界を与えます。

View onDraw をコンテキストとして使用する簡単な例を次に示します。

public class MyView extends View {
    Rect rect;
    Bitmap mBitmap;
    BitmapDrawable mDrawable;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 100, 100);
        mBitmap = loadBitmap();
        mDrawable = new BitmapDrawable(context.getResources(), mBitmap);
        mDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        mDrawable.setBounds(rect);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.draw(canvas);
    }

    public Bitmap loadBitmap() {
        // included only for example sake
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        Bitmap bm = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        canvas.drawRect(0,0,10,10, paint);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.BLUE);
        canvas.drawRect(0, 0, 9, 9, paint);
        return bm;
    }
}

ノート:

コードで行う代わりに、xml で BitmapDrawable を定義することもできます。

また、getResources().getDrawable(resourceId) を介してロードしているドローアブルが実際に単なるビットマップであることがわかっている場合は、それを BitmapDrawable にキャストして、そこに TileMode を設定できます。アラ:

public class MyView extends View {
    Rect rect;
    BitmapDrawable mDrawable;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 400, 240);
        mDrawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.ic_launcher);
        mDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        mDrawable.setBounds(rect);

        this.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.draw(canvas);
    }
}

この例は、引き伸ばされている背景と、その上に描画されているタイル バージョンを示しています。

別の方法:

x 方向と y 方向にループし、ビットマップを rect に繰り返し描画します。

public class MyView extends View {
    Rect rect;
    Bitmap mBitmap;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 100, 100);
        mBitmap = loadBitmap();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        final int bmWidth = mBitmap.getWidth();
        final int bmHeight = mBitmap.getHeight();

        for (int y = 0, height = rect.height(); y < height; y += bmHeight) {
            for (int x = 0, width = rect.width(); x < width; x += bmWidth) {
                canvas.drawBitmap(mBitmap, x, y, null);
            }
        }
    }

    public Bitmap loadBitmap() {
        // included only for example sake
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        Bitmap bm = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        canvas.drawRect(0,0,10,10, paint);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.BLUE);
        canvas.drawRect(0, 0, 9, 9, paint);
        return bm;
    }
}

個人的には、最初の (BitmapDrawable) メソッドを使用します。

于 2012-07-13T15:00:25.540 に答える
5

BitmapDrawable と同じように実行できます。

ビットマップ シェーダーでペイントを定義し、そのペイントで四角形を描画します。

>     Paint paint = new Paint();
>     paint.setShader(new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));
>     
>     canvas.drawRect(destRect, paint);
于 2015-09-21T01:36:49.743 に答える