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 回答