2011-09-16 3 views
7

私はRelativeLayoutの背景として使用しているイメージを持っています。パターンを作成するには、画像を水平に並べる必要があります。ビットマップ描画可能なタイルをxで作成しますが、yに伸ばします

私はこのコードを使用することにより、水平方向のタイルに画像を取得することができるよ:

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

b3.setTileModeX(Shader.TileMode.REPEAT); 

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

問題は画像も縦に並べていることです。それは垂直では "クランプ"モードで、水平では "リピート"モードでタイルするようです。ここではスクリーンショットです:

TileMode

あなたが見ることができるように、画像は、それが占有するスペースよりも少しだけ小さくなり、かつ下端が「クランプ」です。

画像を縦方向に引き伸ばし、横向きに設定するにはどうすればよいですか?

答えて

5

このメソッドは、新しいビットマップの作成を呼び出しますが、それはそうメソッドLILE onWindowFocusChangedは、このコードのために良い場所で、ビューがすでにレイアウトされた場合にのみ動作することに注意してください、あなたの目標

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

をacrhivingているように見えます。私はそれを感じる

+0

drawable XMLを組み合わせるだけで可能ですか? – neworld

0

私自身も同じ問題があります。 9patchイメージを使用しようとしましたが、9patchイメージをタイルと共に使用することはできないようですが、9patchは、タイルプロパティで定義したものに関係なくイメージを伸ばします。 最後に、画像の作成者に垂直に伸ばしたり、自分でやり直してもらうようにしています。もし誰かが見つけたらもっと良い解決策が大好きです。

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; 
    } 
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(); 
    } 
} 
} 
関連する問題