Android um ein Layouts Hintergrundbild, nur obere oder untere Ecken

Ich möchte in der Lage sein, einen Bildschirm mit mehreren RelativeLayouts zu haben, und ich möchte das obere Layout und das untere Layout haben abgerundete Ecken, so Top-Layout würde Top 2 Ecken abgerundet haben, und Boden-Layout würde unten 2 Ecken abgerundet haben.

Mein Problem ist, alle Beispiele, die ich online finde, verwenden shape.xml, um eine abgerundete Ecke zu schaffen und gab ihm einen Farbverlauf und das ist nicht gut genug, denn ich möchte das relativeLayout ein Hintergrundbild geben und das Bild abgerundet haben, Und ich kann nicht scheinen, beides zu tun.

Jede Hilfe wäre sehr dankbar!

EDIT – Bounty gestartet

Okay, ich habe meinen Kopf gegen die Wand geschlagen. Ich benutze ein Drittanbieter-Tool namens UITableView im Moment, vor allem nur testen etwas aus.

Https://github.com/thiagolocatelli/android-ableableview

Es richtet TableView ähnlich wie die Art und Weise iPhone Tisch ist, und ich möchte in der Lage, jede Zeile ein Hintergrundbild geben, und haben die oberen und unteren Reihen gekrümmt. In dieser UITableView-Klasse unter Commit wird dieser Code aufgerufen

public void commit() { mIndexController = 0; if (mItemList.size() > 1) { // when the list has more than one item for (IListItem obj : mItemList) { View tempItemView; if (mIndexController == 0) { //tempItemView = new RoundedView(context_i, this); tempItemView = mInflater.inflate(R.layout.list_item_top,null); } else if (mIndexController == mItemList.size() - 1) { tempItemView = mInflater.inflate(R.layout.list_item_bottom,null); } else { tempItemView = mInflater.inflate(R.layout.list_item_middle,null); } setupItem(tempItemView, obj, mIndexController); tempItemView.setClickable(obj.isClickable()); mListContainer.addView(tempItemView); mIndexController++; } } else if (mItemList.size() == 1) { // when the list has only one item View tempItemView = mInflater.inflate(R.layout.list_item_single, null); IListItem obj = mItemList.get(0); setupItem(tempItemView, obj, mIndexController); tempItemView.setClickable(obj.isClickable()); mListContainer.addView(tempItemView); } } 

Er hat einen Layout-Stil für die obere mittlere und untere Reihe, oben und unten gerundet verwendetes XML, aber das Problem ist, ich möchte jeder Zeile ein Bild geben. Also habe ich diesen Code hinzugefügt

 tempItemView.setBackgroundResource(R.drawable.background); 

Aber das Problem ist, das entfernt die gebogenen Ecken für die oberen und unteren Reihen, da die Ecken mit XML abgerundet sind und weiße Farbverläufe verwenden, kein Bild. Ich muss in der Lage sein, das Layout aufzublasen, dann die oberen und unteren Ecken zu krümmen. Ich habe mir so viele Beispiele für die Ecken angeschaut und sogar verschiedene Drittanbieter-Tools ausprobiert, aber noch ein einziges Beispiel gefunden, das das Auftragen eines Hintergrundbildes auf einen Container zeigt und dann die Ecken abrundet.

Hat jemand irgendwelche Ideen, wie man das macht?

Bearbeiten:

Auf dem iPhone kannst du so etwas machen

 UIColor *color = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]; 

Wo man ein Bild in eine Farbe umwandelt. Hat Android ein Äquivalent?

Bearbeiten:

Danke an ACheese für die Antwort, ich habe seinen Code geändert und in 3 Methoden getrennt, eine für die abgerundeten Ecken, eine für ganz abgerundete Ecken und eine für die abgerundeten Ecken und kam dazu

 public void setBackgroundRounded(int resID, int w, int h, View v) { DisplayMetrics metrics = getResources().getDisplayMetrics(); double dH = (metrics.heightPixels / 100) * 1.5; int iHeight = (int)dH; Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); Shader shader = new BitmapShader(BitmapFactory.decodeResource( getResources(), resID), Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); paint.setShader(shader); RectF rec = new RectF(0, 0, w, h); c.drawRoundRect(rec, iHeight, iHeight, paint); v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp)); } public void setTopRounded(int resID, int w, int h, View v) { Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); Shader shader = new BitmapShader(BitmapFactory.decodeResource( getResources(), resID), Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); paint.setShader(shader); RectF rec = new RectF(0, 0, w, h - 20); c.drawRect(new RectF(0, 20, w, h), paint); c.drawRoundRect(rec, 20, 20, paint); v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp)); } public void setBottomRounded(int id, int w, int h, View v) { DisplayMetrics metrics = getResources().getDisplayMetrics(); double dH = (metrics.heightPixels / 100) * 1.5; int iHeight = (int)dH; Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); Shader shader = new BitmapShader(BitmapFactory.decodeResource( getResources(), id), Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); paint.setShader(shader); RectF rec = new RectF(0, 0, w, h); c.drawRoundRect(rec, iHeight, iHeight, paint); c.drawRect(new RectF(0, 0, w, h-iHeight), paint); v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp)); } 

Ich benutze Metriken, um zu etablieren, wie viel um die Ansicht runden, also skaliert mit verschiedenen Bildschirmgrößen.

Hoffe, das hilft anderen, die dieses Problem haben!

4 Solutions collect form web for “Android um ein Layouts Hintergrundbild, nur obere oder untere Ecken”

Prüfen Sie, ob meine Lösung für Ihren Fall funktioniert: Definieren Sie Ihr eigenes Layout, indem Sie RelativeLayout erweitern. Sie müssen nur den folgenden Code hinzufügen

 @SuppressWarnings("deprecation") public void setBackground(int id){ Bitmap bmp = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); Shader shader = new BitmapShader(BitmapFactory.decodeResource(getResources(), id), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); paint.setShader(shader); RectF rec = new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()); // you may need this for only top round corner // RectF rec = new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()-20); // c.drawRect(new RectF(0, 20, getMeasuredWidth(), getMeasuredHeight()), paint); c.drawRoundRect(rec, 20, 20, paint); this.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp)); } 

Nennen Sie diese Methode aus Ihrer Aktivität. Sie können nicht von onCreate () anrufen, da getMeasuredWidth () und getMeasuredHeight () nicht bereit sind. Override und ruf von onWindowFocusChanged (boolean hasFocused), indem du deine eigene Drawable ID setzt. Dies wiederholt die Einstellung Ihres Bildes als Hintergrund mit runden Ecken.

Also hast du so etwas versucht:

Zum Beispiel ist dies Ihr Hauptlayout:

 RelativeLayout myMainRelLAyout = (RelativeLayout) findViewById(R.id.my_layout); 

Und mache MyMainRelLAyout.setBackgroundResource(R.drawable.mydrawable);

Wo mydrawable.xml sieht so aus:

  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@android:color/white" /> <corners android:bottomLeftRadius="0dip" android:bottomRightRadius="0dip" android:topLeftRadius="5dip" android:topRightRadius="5dip" /> </shape> 

Abhängig von den Kommentaren unten kann ich Ihnen diesen Link vorschlagen: Romain Guy – Bild mit abgerundeten Ecken , wo man eine Antwort finden kann, die ich dir helfen werde, wie man das macht.

Und hier ist eine weitere nützliche Bibliothek, die mit ImageView, aber Sie können es ändern und verwenden Sie es für jede Art von View, Link: RoundedImageView .

Okay, ich habe endlich eine Lösung gefunden. Um die oberen Ecken zu runden, verwenden Sie diese Methode

 public Bitmap getTopRoundedCorner(Bitmap bitmap, DisplayMetrics metrics) { //Using this so it scales with different screen sizes double dH = (metrics.heightPixels / 100.0) * 3; int iHeight = (int) dH; //Subtract this from bitmap height Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight()-iHeight, 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()); //Again used so it scales with diff screen sizes //Can play around with this value, depending on how rounded you wanted the corner dH = (metrics.heightPixels / 100.0) * 3.5; iHeight = (int) dH; final RectF rectF = new RectF(rect); final float roundPx = iHeight; 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; } 

Wenn Sie nur die untere Ecke runden wollen, verwenden Sie diese Methode

 public Bitmap getBottomRoundedCorner(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); //Again play around with this to get the rounded value you require double dH = (metrics.heightPixels / 100.0) * 2.5; int iHeight = (int) dH; final float roundPx = iHeight; 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); //Draw second rectangle over the top of the first one //So it hides the top rounded corners iHeight = (int) dH; final int color2 = 0xff424242; final Paint paint2 = new Paint(); Canvas canvas2 = new Canvas(output); final Rect testRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()-iHeight); final RectF testF = new RectF(testRect); paint2.setAntiAlias(true); canvas2.drawARGB(0, 0, 0, 0); paint2.setColor(color2); canvas2.drawRoundRect(testF, roundPx, roundPx, paint2); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas2.drawBitmap(bitmap, testRect, testRect, paint2); return output; } 

Auch wenn du in verschiedenen Bildern umgehst, die verschiedene Größen haben, würde ich dir empfehlen, diese Methode zuerst zu verwenden

 public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // CREATE A MATRIX FOR THE MANIPULATION Matrix matrix = new Matrix(); // RESIZE THE BIT MAP matrix.postScale(scaleWidth, scaleHeight); // "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); return resizedBitmap; } 

Skalieren Sie die Bilder bis zur gleichen Größe, bevor Sie die abgerundete Eckenmethode anwenden, sonst, wenn Sie ein anderes Bild mit unterschiedlicher Breite / Höhe passieren, werden die abgerundeten Ecken ganz anders aussehen, je nachdem, welches Bild eingegeben wird. Wenn Sie das Bild skalieren Up zuerst, es bedeutet, egal welches Bild du passierst, sollte ziemlich konsequent aussehen.

Dann kannst du einfach so etwas machen

 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.tablebackground); bmp = getResizedBitmap(bmp, 200, 300); bmp = getTopRoundedCorner(bmp); BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(),bmp); subLayout = (RelativeLayout) findViewById(R.id.subLayout); subLayout.setBackgroundDrawable(backgroundDrawable); 

Hoffe, das hilft jedem anderen, die das gleiche Problem hatten!

Was ist mit der Verwendung einer LayerListe, wo du die Bitmap einsetzst , ihre Eckenrundung und dann als Relative Layouts Hintergrund?

Die Dokumentation enthält einen Schritt für Schritt, wie man es macht.

  • Sqlite-Datenbank - Wie zu speichern Bild aus der Kamera-Absicht sowie Hashmap zu sqlite, um später abzurufen?
  • Nach Drücken einer Taste, Ansicht nach unten, nur in S3
  • EditText setText wird nicht auf einem Dialogfragment angezeigt
  • Wie bekomme ich Android Market Daten, wenn es keine API gibt?
  • Vergleich von Strings in Java
  • Vermeiden Sie, meinen Fortschrittsdialog zu entfernen, wenn der Benutzer den Bildschirm berührt?
  • Android: Wie kann ich verhindern, dass das Image in ImageView oder ImageButton skaliert wird?
  • NFC NdefFormatable class connect () wirft IOException auf
  • Wie bekommst du das Telefon MCC und MNC in Android?
  • Warum das Hinzufügen von <merge> ändert sich das Android-Layout?
  • Android Studio Annotation AbstractProcessor nicht gefunden
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.