2010-01-27 20 views
10

Program aracılığıyla bir düğme oluşturuyorum. Bu yuvarlatılmış ve bir degrade arka planı vardır ve iyi çalışıyor ve güzel görünüyor, ancak istediğim iki şeyi yapamadım:Düğme oluşturmaya çalışılıyor: Kontur renginin nasıl ayarlanacağı ve bir degradenin yüksekliği bilmeden nasıl "hizalanacağı" nasıl ayarlanır?

  1. Verilen bir renkle 1 piksel konturu oluşturun. GetPaint(). SetStroke() yöntemini denedim, ancak kontur renginin nasıl ayarlanacağını belirleyemedim. Nasıl yapmalıyım?
  2. Eğimi, hangi yükseklikte olursa olsun düğmenin altına hizalayın. Mümkün mü?
  3. Başvuru için

, bu kullanıyorum kodudur:

İlk sorunuz açısından
Button btn = new Button(context); 
btn.setPadding(7, 3, 7, 5); 
btn.setTextColor(text_color); 

// Create a gradient for the button. Height is hardcoded to 30 (I don't know the height beforehand). 
// I wish I could set the gradient aligned to the bottom of the button. 
final Shader shader = new LinearGradient(0, 0, 0, 30, 
    new int[] { color_1, color_2 }, 
    null, Shader.TileMode.MIRROR); 

float[] roundedCorner = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 } 
ShapeDrawable normal = new ShapeDrawable(new RoundRectShape(roundedCorner, null, null)); 
normal.getPaint().setShader(shader); 
normal.setPadding(7, 3, 7, 5); 

// Create a state list (I suppressed settings for pressed). 
StateListDrawable state_list = new StateListDrawable(); 
state_list.addState(new int[] { }, normal); 

btn.setBackgroundDrawable(state_list); 

cevap

18

, ben de bununla mücadele ve herhangi müsait var gibi gözükmüyor Drawables içindeki yöntemler (ShapeDrawable kullanıyordum) veya Paint sınıfı.

public class CustomBorderDrawable extends ShapeDrawable { 
    private Paint fillpaint, strokepaint; 
    private static final int WIDTH = 3; 

    public CustomBorderDrawable(Shape s) { 
     super(s); 
     fillpaint = this.getPaint(); 
     strokepaint = new Paint(fillpaint); 
     strokepaint.setStyle(Paint.Style.STROKE); 
     strokepaint.setStrokeWidth(WIDTH); 
     strokepaint.setARGB(255, 0, 0, 0); 
    } 

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

    public void setFillColour(int c){ 
     fillpaint.setColor(c); 
    } 
} 
+0

Bu neredeyse çalışır, ancak kontur kırpılır. Bu bağlantı daha fazla ayrıntı içerir: http://www.betaful.com/2012/01/programmatic-shapes-in-android/ – mxcl

+0

Yukarıdaki bağlantı bozuk. Bu güncelleştirilmiş bağlantıdır: http://betaful.com/post/82668809883/programmatic-shapes-in-android –

+0

@ ShamsShafiq, @ Stev_k @ moraes, bunun yanı sıra betauful.com cevabını kullanmaya çalışmıştım Köşe yarıçapı ile programatik olarak kenarlık yaratın ... ve çok iyi çalışır ancak görünümün dışında bir kenar oluşturur. Elde ettiğim görünüm, https://drive.google.com/file/d/0BwkVxZWl7VcETlIySV82NC1sV2s/view?usp=sharing bağlantısında mevcut. Bu nedenle, lütfen şu kenarda bulunan kenarları temizlemede bana yardımcı olun .. – TheReprator

5

Sen setStroke (3, Color.WHITE) yöntemi ile GradientDrawable kullanabilirsiniz: Ancak, ben aynı sonucu verecek şekilde, aşağıdaki gibi, ShapeDrawable genişletmek ve beraberlik yöntemi geçersiz başardı. yuvarlatılmış köşeler yapmak için, bunu kullanın:

setShape(GradientDrawable.RECTANGLE); 
setCornerRadii(new float[]{2,2,2,2,2,2,2,2}); 
0

.... bu deneyin çekilebilir yeni xml dosyası yapmak ve istediğiniz yere ayarlayın ..!

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" > 

    <solid android:color="#e1e1e1" /> 

    <stroke 
     android:width="2dp" 
     android:color="#808080" /> 

    <corners android:radius="10dp" /> 

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

</shape> 
İlgili konular