2013-11-24 7 views
11

Ich muss einen Rahmen mit abgerundeten Ecken programmatisch durch Erweitern ShapeDrawable erstellen. Ich brauche einen schwarzen Rand mit abgerundeten Ecken, wobei die Pixel außen weiß und die inneren Pixel transparent sind. Der Code, den ich im Moment habe, hat mehrere Probleme, von denen es ist, dass es keine glatte Ecke schafft, die die gleiche Dicke wie die Grenze hat und dass die äußeren Pixel der Grenze transparent und nicht weiß sind.Wie programmiere ich einen runden Rand mit ShapeDrawable in Android?

Hier ist ein Bild von den Ecken ich zur Zeit bin immer corner

Hier ist der Code, wo ich Color.TRANSPARENT für ‚füllen‘ im Konstruktor bin vorbei:

public class CustomShape extends ShapeDrawable { 
private final Paint fillpaint, strokepaint; 
public CustomShape(int fill, int strokeWidth,int radius) { 

    super(new RoundRectShape(new float[] { radius, radius, radius, radius, radius, radius, radius, radius }, null, null)); 
    fillpaint = new Paint(this.getPaint()); 
    fillpaint.setColor(fill); 
    strokepaint = new Paint(fillpaint); 
    strokepaint.setStyle(Paint.Style.STROKE); 
    strokepaint.setStrokeWidth(strokeWidth); 
    strokepaint.setColor(Color.BLACK); 
} 



@Override 
protected void onDraw(Shape shape, Canvas canvas, Paint paint) { 
    shape.draw(canvas, fillpaint); 
    shape.draw(canvas, strokepaint); 
} 

}

+0

versucht Drawable können zu verlängern (und eine benutzerdefinierte dtaw) anstelle von ShapeDrawable? – pskink

Antwort

0

Sie können ein benutzerdefiniertes Zeichen implementieren. Das folgende Beispiel zeigt das XML.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#ffffffff"/>  

    <stroke android:width="3dp" 
      android:color="#ff000000" 
      /> 

    <padding android:left="1dp" 
      android:top="1dp" 
      android:right="1dp" 
      android:bottom="1dp" 
      /> 

    <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" 
    android:topLeftRadius="7dp" android:topRightRadius="7dp"/> 
</shape> 

Speichern Sie diese XML-Datei im ausklappbaren Ordner Ihres Projekts. Jetzt benutze es wie ein normales Zeichen für jedes Widget. Zum Beispiel: android: background = "R.drawable.round_shape"

Dieses Beispiel wird nach link referenziert.

13

Wenn Sie gleichmäßig Ecken müssen abgerundet (und von Ihrem Beispiel scheint es, Sie tun) Sie können einfach verwenden GradentDrawable mit einer soliden Farbe

GradientDrawable gd = new GradientDrawable(); 
gd.setColor(Color.RED); 
gd.setCornerRadius(10); 
gd.setStroke(2, Color.WHITE); 

view.setBackground(gd); 

GradientDrawable Dokumentation here gefunden werden kann.

Edit: Für jede Ecke separat

Sie Radius jeder Ecke angeben können separat setCornerRadii (float[] radii) Methode. "Für jede Ecke enthält das Array 2 Werte, [X_radius, Y_radius]. Die Ecken sind oben links, oben rechts, unten rechts, unten links angeordnet. Diese Eigenschaft wird nur berücksichtigt, wenn die Form vom Typ RECTANGLE ist.

Es wird empfohlen, mutate() vor Änderung dieser Eigenschaft aufzurufen.

+0

Gibt es die Möglichkeit, leftCornerRadius und rightCornerRadius anzugeben? – Chandru

+0

zusätzlich eine Notiz hinzugefügt, wie jede Ecke separat gerundet werden kann – SGal

0

Neben der runden Ecke angeben Dimens Sie GradientDrawable und die Methode setCornerRadii()

GradientDrawable d = new GradientDrawable(); 
d.setCornerRadii({5.0f,5.0f,5.0f,5.0f}); 
textViewExample.setBackgroundResource(d); 
0
GradientDrawable drawable = (GradientDrawable)image.getBackground(); 
drawable.setGradientRadius(radiuspx);