2012-08-26 11 views
5

tengo al lado dibujable XML blue_buttonXML esquinas redondeadas dibujable Android con la etiqueta de mapa de bits

<?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> 

Y tengo button_blue_bg imagen con gradiente con un ancho de 1 píxel.

Cuando fijo fondo botón i GET siguiente imagen

enter image description here

Como se puede ver, no tengo fondo recortado con borde redondeado.

¿Cómo necesito modificar xml para que la imagen de degradado de fondo no esté fuera del borde?

Entiendo por qué sucedió, porque uso capas, así que esto es como un sándwich, pero también estoy programando en el objetivo c, y allí también se usan capas. Pero en Apple está bien.

Respuesta

4

yo uso esto .... En primer lugar una capa para la definición básica, establezca esta capa como backgound de su diseño:

<?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> 

i utilizar este función para la fabricación de esquinas redondeadas:

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

y Finaly, el código de la actividad:

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

No funciona con RelativeLayout y ImageView –

0

Un 9-patch sería perfecto para su situación

+1

No, no lo es. Por muchas razones como: entonces no puedo establecer el ángulo variable de las esquinas; también uso este bg_img en dos lugares más, así que si uso el parche 9, siempre necesito usar un control más redondo, pero tengo lugares donde no necesito una esquina redondeada, pero necesito este bg; también tamaño y número de imágenes. –

Cuestiones relacionadas