2012-08-26 10 views
5

ho prossima drawable XML blue_buttonAndroid XML disegnabili angoli arrotondati con tag bitmap

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <layer-list> 
     <item><bitmap android:src="@drawable/button_blue_bg" /> 
     </item> 
     <item > 
     <shape> 
       <corners android:radius="50dip" /> 
       <stroke android:width="1dip" android:color="#ccffffff" /> 
       <solid android:color="#00000000" /> 
       <padding android:bottom="3dip" 
         android:left="3dip" 
         android:right="3dip" 
         android:top="3dip" /> 
     </shape> 
     </item> 
    </layer-list> 
    </item> 
</selector> 

e devo button_blue_bg immagine con gradiente con larghezza 1px.

quando ho impostato il pulsante sfondo ottengo immagine successiva

enter image description here

Come potete vedere ho sottofondo non tagliato con bordo arrotondato.

Come ho bisogno di modificare xml per l'immagine del gradiente di sfondo non essere al di fuori del confine?

Capisco perché è successo, perché uso i livelli - quindi questo è come un sandwich - ma ho anche programmato sull'obiettivo c, e lì si usano anche i livelli. Ma in Apple è benissimo.

risposta

4

io uso questo .... In primo luogo una Strato per la definizione di base, impostare questo livello come backgound del layout:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
     <stroke android:width="0.2dp" android:color="@color/anycolor" /> 
     <corners android:radius="10dp" > </corners> 
    </shape> 
    </item> 
    <item> 
     <bitmap android:src="@drawable/imgback" /> 
    </item> 
</layer-list> 

io uso questo funzione di messa angoli arrotondati:

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { 

     Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), 
      bitmap.getHeight(), Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     final int color = 0xff424242; 
     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     final RectF rectF = new RectF(rect); 
     final float roundPx = 12; 

     paint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(color); 
     canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 

     paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
     canvas.drawBitmap(bitmap, rect, rect, paint); 

     return output ; 
     }  

e Finaly, il codice nell'attività:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.menu); 
    // i use a Relative Layout 
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rlmenu); 
    // Obtain then backgroud of RelativeLayout 
    LayerDrawable layer = (LayerDrawable) rl.getBackground(); 
    // obtain the image set in the Layer 
    BitmapDrawable bg = (BitmapDrawable) layer.getDrawable(1); 
    // create a new BitmapDrawable from the function 
    Drawable d =new BitmapDrawable(getRoundedCornerBitmap(bg.getBitmap())); 
    // set the new roundcorner image in the layer 
    layer.setDrawableByLayerId(1, d); 
    rl.setBackgroundDrawable(d); 

} 
+0

Non funziona con RelativeLayout e ImageView –

0

Un 9-patch sarebbe perfetto per la vostra situazione

+1

No, non lo è. Per molte ragioni come: allora non posso impostare l'angolo variabile degli angoli; anche io uso questo bg_img in altri due posti, quindi se uso 9-patch - ho bisogno di usare ogni volta il controllo rounder, ma ho dei punti in cui non ho bisogno di un angolo arrotondato, ma ho bisogno di questo bg; anche dimensioni e numero di immagini. –