2012-08-26 4 views
5

Ich habe nächst XML ziehbar blue_buttonAndroid XML ziehbar abgerundete Ecken mit Bitmap-Tag

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

Und ich habe Bild button_blue_bg mit Steigung mit 1px Breite.

Wenn i-Taste Hintergrund bekomme ich nächstes Bild

enter image description here

Wie Sie mich nicht mit abgerundeten Rand abgeschnitten habe Hintergrund sehen.

Wie brauche ich Modifikation xml für Hintergrund Farbverlauf Bild nicht außerhalb Grenze?

Ich verstehe, warum es passiert, weil ich Ebenen verwende - so wie Sandwich-, aber ich programmiere auch auf Ziel c, und dort ist es auch Schichten verwenden. Aber in Apple ist es in Ordnung.

Antwort

4

ich dieses verwenden .... zuerst eine Schicht für die Grunddefinition dieser Schicht als backgound des Layouts gesetzt:

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

ich dies verwenden Funktion zur Herstellung abgerundete Ecken:

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

und finaly, der Code in der Aktivität:

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

Es funktioniert nicht mit RelativeLayout und ImageView –

0

A 9-patch würde für Ihre Situation perfekt sein

+1

Nein, ist es nicht. Aus vielen Gründen wie: dann kann ich keinen variablen Eckenwinkel einstellen; Außerdem verwende ich dieses bg_img in zwei-mehr Orten, wenn ich 9-Patch verwende - ich brauche jedes Mal, verwende runder Kontrolle, aber ich habe Plätze, wo ich keine abgerundete Ecke brauche, aber ich brauche dieses bg; auch Größe und Anzahl der Bilder. –