2

我有一个按钮。该按钮由 StateListDrawable(由 3 个 9-patch 图像组成)构成。我需要添加一个额外的drawable,它将驻留在按钮的右侧,并且我需要它与按钮的右侧对齐。我尝试使用以下内容:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/blue_back_button_drawable" />
    <item>
      <bitmap android:src="@drawable/filter_by_button_v_mark" android:gravity="right"/>
    </item>
</layer-list>

它没有用,V 图像确实是正确对齐的,但它与按钮的右侧有差异。这是一个快照:替代文字

我希望图像与按钮的左侧对齐,现在我认为我能做到的唯一方法是:

  1. 继承按钮,在 onLayout 设置宽度后获取右边缘。
  2. 获取背景可绘制对象(layerDrawable)
  3. 计算按钮的宽度减去 v 图像的宽度,并将其设置为可绘制对象的左边距。

我不应该提到这听起来很可怕:-) 我希望有更好的方法。哦,它不是图像的一部分的原因是我需要知道它的宽度,这样我才能计算文本填充,这样它就不会被按钮的文本隐藏,而且它看起来不像 9 补丁那么好看。

4

1 回答 1

0

似乎没有适当的解决方案。layer 显然是静态而不是 9-patch 图像,或者看起来如此。因此,我扩展了 Button,将其更改为 Draw,我必须使用 Canvas.restore() 打破将我的边缘向下推的边距并将我的图像放在右上角......这是代码:

 @Override
public void setPadding(int left, int top, int right, int bottom) {
    right += mImageWidth;
    super.setPadding(left, top, right, bottom);
}

private void setVImageDrawable(Drawable d) {
    mVImageDrawable = d;
    mImageWidth = mVImageDrawable.getIntrinsicWidth();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if( mVImageDrawable != null && mIsMarked){
        //for some reason the clip binds us to position with margins, which is not so good for us.
        //we need to save the clip, restore the canvas to pre clipping mode, do what we need then
        //put the canvas back to it's previous clipping state.
        Rect bounds = canvas.getClipBounds();
        canvas.restore();
        int right = getRight();
        int left = right - mImageWidth;
        int top = getTop();
        int bottom = top + mVImageDrawable.getIntrinsicHeight();
        mVImageDrawable.setBounds(left, top, right, bottom);
        mVImageDrawable.draw(canvas);
        canvas.save();
        canvas.clipRect(bounds);
    }
}

如果我没有通过我添加的任何边距打破原始画布 iget '下推',我认为它也可能被修复,我认为使用 xml 属性指定是否应在包含此按钮的布局上剪辑子项,但我发现那很蹩脚解决方案,因为它使我的按钮取决于我们的条件。我使用我声明的新属性、样式和主题从 XML 获得的图像本身。

希望它会帮助一些人在那里。

于 2010-11-23T15:38:44.983 回答