2

我想创建一个带彩色正方形的选项组,供用户选择一个。它正在开发一种3.2设备上,并且在这张图片看起来像: enter image description hereStateListDrawable与编程创建的LayerDrawable不能在Android 4.0+上工作

的代码是一样的东西:

for (int i = 0; i < COLORS.length; i++) { 
     CheckBox box = new CheckBox(context); 
     box.setBackgroundDrawable(getColorOption(context, COLORS[i])); 
     box.setButtonDrawable(android.R.color.transparent); 

,然后在getColorOption功能我创建StateListDrawable:

StateListDrawable slDrawable = new StateListDrawable(); 

    LayerDrawable checkedDrawable = new LayerDrawable(new Drawable[] { 
      new SelectFrameShapeDrawable(transparentColor, lightRedColor), 
      new SquareShapeDrawable(color) }); 
    LayerDrawable uncheckedDrawable = new LayerDrawable(new Drawable[] { 
        new SelectFrameShapeDrawable(transparentColor, transparentColor), 
        new SquareShapeDrawable(color) }); 
    slDrawable.addState(new int[] { android.R.attr.state_checked }, 
      checkedDrawable); 
    slDrawable.addState(new int[] { -android.R.attr.state_checked }, uncheckedDrawable); 
    return slDrawable; 

SquareShapeDrawable类是ShapeDrawable类:

public class SquareShapeDrawable extends ShapeDrawable { 
    private final Paint fillpaint; 

    public SquareShapeDrawable(int color) { 
     super(new RectShape()); 
     fillpaint = new Paint(this.getPaint()); 
     fillpaint.setColor(color); 
    } 

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

而且SelectFrameShapeDrawable是:

private class SelectFrameShapeDrawable extends ShapeDrawable { 
private final Paint fillpaint, strokepaint; 

public SelectFrameShapeDrawable(int fill, int stroke) { 
     super(new RectShape()); 
     strokepaint = new Paint(this.getPaint()); 
     strokepaint.setStyle(Paint.Style.STROKE); 

     strokepaint.setStrokeWidth((int) (getResources() 
       .getDisplayMetrics().density + 0.5f)); 
     strokepaint.setColor(stroke); 
     int padding = (int) (4 * getResources().getDisplayMetrics().density + 0.5f); 
     setPadding(padding, padding, padding, padding); 

     fillpaint = new Paint(strokepaint); 
     fillpaint.setColor(fill); 
    } 

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

在4.2设备上的所有方块是黑色的,检查时不改变: enter image description here

这个问题似乎加入可绘制到StateListDrawable时.. 任何想法如何解决这个问题?

回答

1

我解决了黑色方块问题,通过移除扩展ShapeDrawable的自定义类,并用直接使用ShapeDrawable类的代码段取代它们。此代码似乎适用于所有平台。

虽然原始问题出现在4.2而不是3.2上,但这很奇怪。我原来的灵感来源是这样的:http://www.betaful.com/2012/01/programmatic-shapes-in-android/

ShapeDrawable selectFrame = new ShapeDrawable(); 
    selectFrame.setShape(new RectShape()); 
    selectFrame.getPaint().setColor(lightRedColor); 
    selectFrame.getPaint().setStyle(Paint.Style.STROKE); 
    selectFrame.getPaint().setStrokeWidth((int) (getResources().getDisplayMetrics().density + 0.5f)); 
    int padding = (int) (4 * getResources().getDisplayMetrics().density + 0.5f); 
    selectFrame.setPadding(padding, padding, padding, padding); 

    ShapeDrawable square = new ShapeDrawable(); 
    square.setShape(new RectShape()); 
    square.getPaint().setColor(color); 

    LayerDrawable checkedDrawable = new LayerDrawable(new Drawable[] { 
      selectFrame, square }); 
... 
+0

为什么它使用StateListDreawable工作? – jonney 2014-10-24 22:15:29

0

在我的模拟器与android 4.2修订版2(最新更新),复选框不会出现,我发现问题是:当setButtonDrawable为null或ColorDrawable时,复选框度量它的大小为0的宽度。这不是StateListDrawable的原因。

我尝试设置复选框的宽度和高度,并且一切似乎都正常。 试试这个:box.setWidth(30); box.setHeight(30); 或者当您使用layoutparams(例如“new RelativeLayout.LayoutParams(50,50));”将复选框添加到布局时。 希望这个帮助

+0

是的,我的复选框添加到使用的代码波纹管中的LinearLayout,但广场仍是全黑:LinearLayout.LayoutParams params1 =新LinearLayout.LayoutParams( 环境。 getResource()。getDimensionPixelSize( R.dimen.dashboard_item_size),context .getResources()。getDimensionPixelSize( R.dimen.dashboard_item_size)); – 2013-04-30 16:36:15

相关问题