在x中绘制位图可绘制的图块,但在y中绘制

我有一个图像,我用它作为RelativeLayout的背景。 图像需要水平平铺以形成图案。

我能够通过使用下面的代码来获取水平平铺图片:

BitmapDrawable b3 = (BitmapDrawable)getResources().getDrawable(R.drawable.background); b3.setTileModeX(Shader.TileMode.REPEAT); v.findViewById(R.id.layout).setBackgroundDrawable(b3); 

问题是,图像也垂直瓦片。 它似乎在垂直“钳”模式瓷砖,而在水平“重复”模式。 这是一个截图:

TILEMODE

正如你所看到的,图像比它占据的空间稍微小一点,而底部边缘被“夹住”。

我怎样才能设置图像垂直拉伸,但水平平铺?

此方法调用创build新的位图,但它看起来像实现您的目标

  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(bitmap); view.setBackgroundDrawable(bitmapDrawable); 

请注意,它只适用于视图已经布置,所以一个方法onWindowFocusChanged是这个代码的好地方。

我觉得这是直截了当的:(这个代码将平铺在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; } 

为时已晚,但可能对他人有用。

您可以创build一个自定义视图为了做到这一点。 只需将源位图缩放到与视图一样高,然后在canvas上重复绘制即可:

 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(); } } } 

自己也有同样的问题。 尝试使用9patch图像,但似乎你不能使用9patch图像与平铺,无论你在平铺属性中定义的东西,9patch拉伸图像。 最后,我要做的就是让图像的创build者垂直拉伸或者自己做。 如果有人发现,我会喜欢更好的解决scheme。