7

RelativeLayout の背景として使用している画像があります。パターンを作成するには、画像を水平に並べる必要があります。

次のコードを使用して、画像を水平方向に並べて表示できます。

BitmapDrawable b3 = (BitmapDrawable)getResources().getDrawable(R.drawable.background);

b3.setTileModeX(Shader.TileMode.REPEAT);

v.findViewById(R.id.layout).setBackgroundDrawable(b3);

問題は、画像も縦に並べて表示されることです。縦は「クランプ」モードでタイル張りに見えますが、横は「リピート」モードです。スクリーンショットは次のとおりです。

タイルモード

ご覧のとおり、画像は占めるスペースよりもほんの少し小さく、下端が「固定」されています。

画像を縦に引き伸ばして横に並べるにはどうすればよいですか?

4

4 に答える 4

6

このメソッドは新しいビットマップの作成を呼び出しますが、目標を達成しているように見えます

        View view = findViewById(R.id.layout);
        BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(R.drawable.tile);
        int width = view.getWidth();
        int intrinsicHeight = bd.getIntrinsicHeight();
        Rect bounds = new Rect(0,0,width,intrinsicHeight);
        bd.setTileModeX(TileMode.REPEAT);
        bd.setBounds(bounds);
        Bitmap bitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), bd.getBitmap().getConfig());
        Canvas canvas = new Canvas(bitmap);
        bd.draw(canvas);
        BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
        view.setBackground(bitmapDrawable);

ビューがすでにレイアウトされている場合にのみ機能することに注意してください。したがって、このコードにはメソッド lileonWindowFocusChangedが適しています。

于 2011-10-12T08:34:10.557 に答える
2

私はそれが簡単だと感じます:(このコードは Y でタイル表示され、x で繰り返されます)

onWindowFoucsChanged で次のように呼び出します。

 public void onWindowFocusChanged(boolean hasFocus) {
        // TODO Auto-generated method stub
        super.onWindowFocusChanged(hasFocus);
        Drawable d = getRepeatingBG(this, R.drawable.image_that_you_want_to_repeat);
        body_view.setBackgroundDrawable(d);

    }

private Drawable getRepeatingBG(Activity activity, int center)
    {   

        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled=true;

        Bitmap center_bmp = BitmapFactory.decodeResource(activity.getResources(), center, options);
        center_bmp.setDensity(Bitmap.DENSITY_NONE);
        center_bmp=Bitmap.createScaledBitmap(center_bmp, dm.widthPixels , center_bmp.getHeight(), true);

        BitmapDrawable center_drawable = new BitmapDrawable(activity.getResources(),center_bmp);
//change here setTileModeY to setTileModeX if you want to repear in X
        center_drawable.setTileModeY(Shader.TileMode.REPEAT);

        return center_drawable;
    }
于 2013-06-26T07:49:40.113 に答える
1

あなたにとっては遅すぎますが、他の人にとっては役立つかもしれません。

これを行うために、カスタム ビューを作成できます。ソースビットマップをビューと同じ高さにスケーリングし、キャンバスに繰り返し描画します。

public class RepeatingXImageView extends View {

Bitmap bitmap;
Paint paint;

public RepeatingXImageView(Context context) {
    super(context);
}

public RepeatingXImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public RepeatingXImageView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if(changed) {
        paint = new Paint();
        bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.seekbar_overlay);
        bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bottom - top, false);
    }
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(bitmap == null) return;
    int left = 0;
    while(left < getWidth()) {
        canvas.drawBitmap(bitmap, left, 0, paint);
        left += bitmap.getWidth();
    }
}
}
于 2016-02-21T15:50:51.997 に答える
0

私自身も同じ問題を抱えています。9patch イメージを使用してみましたが、タイリングと一緒に 9patch イメージを使用できないようです。9patch は、タイル プロパティで何を定義してもイメージを引き伸ばします。最後に、画像の作成者に垂直方向に伸ばすか、自分で行うように依頼します。誰かが見つけたら、より良い解決策が欲しいです。

于 2011-10-12T08:01:17.470 に答える