2013-07-19 83 views
2

我想为我的TextView创建一个圆形背景,所以我创建了如下的形状样式。 但我需要有多种颜色的多种尺寸(而textSize保持不变),所以我需要在样式中设置宽度/高度。Android - 多种颜色和大小可绘制的形状样式

从我的理解.. Layer List把所有的形状放在一起?因为我需要在不同的地方调用它12次,所以有12个形状风格的xmls似乎非常麻烦。

有没有更好的方法在一个XML内部拥有所有不同的形状/大小组合?

形状样式:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 
    <corners android:radius="10dp"/> 
    <solid android:color="@color/girl_orange"/> 
     <size 
     android:width="84dp" 
     android:height="84dp" /> 
</shape> 

在布局XML调用方式:

android:background="@drawable/skills_circle" 

在此先感谢!

+0

惊人的QA,谢谢你! – Fattie

回答

1

创建自定义绘制对象,这样你可以有大小/颜色的milions组合:

class CircleDrawable extends Drawable { 
... 
} 
+0

谢谢!我遵循你的建议并创建了一个可定制的可绘制课程。我发布了我的代码在答案:D – Merelda

+0

什么是一个很好的提示,谢谢 – Fattie

1

所以我也跟着从pskink的建议创建了一个CircleDrawable类。

它对我的应用程序非常好用(尽管我不知道它是否是正确的方式......),所以我想我会分享它。

public CircleDrawable(Bitmap bitmap, Context context) { 
    paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.FILL); 
    CircleDrawable.context = context; 
    drawable = new ShapeDrawable(new OvalShape()); 
    setColor(); // supports multiple color 
    setSize(); //supports multiple size 
} 

private void setColor() { 

    // some algorithm to pick the right color... 
    if (...) 
     int color = context.getResources().getColor(R.color.pale_blue); 

    paint.setColor(color); 
} 

    /* 
    * algorithm to set size here... 
    */ 

@Override 
public void draw(Canvas canvas) { 

    //draw circle in the middle of the TextView 
    canvas.drawCircle(textViewSize, textViewSize, circleSize, paint); 
} 

,并在主代码,我需要动态绘制圆:

final float scale = getApplicationContext().getResources().getDisplayMetrics().density; 
    int pixels = (int) (107.0f * scale + 0.5f); 
    skills.setWidth(pixels); 
    skills.setHeight(pixels); 
    skills.setBackground(new CircleDrawable(null, getApplicationContext())); 

而且我结束了一堆不同形状和颜色的圆圈。 enter image description here

+0

好,但你不需要(位图位图参数在构造函数中,也不需要drawable设置为ShapeDrawable,我认为这种问题显示eclipse as warnings – pskink

+0

你是完全正确的,虽然没有显示为警告,但再次感谢:) – Merelda

+0

嘿,你可以在iOS中做到这一点...但它需要约800万行代码:) – Fattie

相关问题