LayerDrawable, странное поведение setLayerInset

Я пытаюсь создать Drawable для ImageButton программно, используя LayerDrawable с 2 слоями. Эти слои являются ShapeDrawables. Один представляет поверхность кнопки, а ее размеры соответствуют размерам кнопки. Второй знак на кнопке, он меньше кнопки. Подумайте о кнопке Стоп в качестве примера.

Я пытаюсь использовать комбинацию setIntrinsicWidth / setIntrinsicHeight и setLayerInset, чтобы поместить знак в центр кнопки, но я получаю странный результат.

public Drawable createStopButtonDrawable(int width, int height) {
    //-- width = 60, height = 30
    ShapeDrawable button = new ShapeDrawable(new RectShape());      
    button.setIntrinsicHeight(height);
    button.setIntrinsicWidth(width);
    button.setShaderFactory(new ShapeDrawable.ShaderFactory() {         
        @Override
        public Shader resize(int width, int height) {
            return new LinearGradient(0, 0, 0, height, 
                    new int[]{0xCDCCCCCC, 0xCDFFFFFF, 0xCDCCCCCC}, 
                    new float[]{0, 0.3f, 1},
                    Shader.TileMode.REPEAT);
        }
    });


    ShapeDrawable sign = new ShapeDrawable(new RectShape());
    int signSize = (int)(STOP_SIGN_SIZE_RATIO * (float)Math.min(width, height));
    //-- signSize = 12
    sign.setIntrinsicHeight(signSize);
    sign.setIntrinsicWidth(signSize);
    Paint psPaint = sign.getPaint();
    psPaint.setStyle(Style.FILL);
    psPaint.setColor(PLAY_BUTTON_SIGN_COLOR);

    Drawable[] layers = new Drawable[]{ button, sign };
    LayerDrawable ld = new LayerDrawable(layers);
    ld.setBounds(0, 0, width, height);
    ld.setLayerInset(0, 0, 0, 0, 0);

    int sx = (int)( (width - signSize)/2.0f );
    //-- sx = 24
    int sy = (int)( (height - signSize)/2.0f );
    //-- sy = 9

    ld.setLayerInset(1, sx, sy, sx, sy);   //-- 1. Sign stretched
    //ld.setLayerInset(1, sx, 10, sx, 9);  //-- 2. Almost good
    return ld;
}

Это производит кнопку со знаком, растянутым, чтобы соответствовать размеру кнопки.

Знак растянут

Однако, если я заменю строку "1. Знак растянут" на "2. Почти хорошо", я получу почти ожидаемый результат.

Знак почти правильный

Что я делаю неправильно?

Я также заметил, что отображаемая поверхность кнопки имеет размер 59x29, а не ожидаемые 60x30.

0 ответов

Другие вопросы по тегам