试图在右侧创建一个复选框,我正在查看Android中的代码。但我很困惑,android正在测量复选框图标/ drawable的宽度。
Checkbox 扩展 CompoundButton 类,并且只覆盖onPopulateAccessibilityEvent方法。 CompoundButton类有一些代码(100行),它扩展了 Button 类。按钮类只有很少的额外代码,并扩展了 TextView 类。 TextView类具有最大量的代码(10,000行)。
以下是源代码的链接
CompoundButton Web -Syntax突出显示 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/CompoundButton.java?av=f
的TextView Web -Syntax突出显示 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/TextView.java?av=f
TextView有一个名为复合drawables 的功能,您可以在文本的左侧,右侧,底部或顶部放置drawable。所以我假设这是CompoundButton为左复合drawable设置复选框drawable的地方。但是在CompoundButton代码中我找不到这个。
然而,当我通过扩展CompoundButton创建一个自定义类,并调用getCompoundPaddingLeft()时,它给出的宽度大约等于复选框的大小。但是当你运行getCompoundDrawables()时,即使在onDraw()的时候,result也是一个空数组。 在textView中,包含所有维度数据的变量都是私有的,因此我不确定CompoundButton如何设置这些值。以下是TextView
中 getCompoundPaddingLeft()的示例 public int getCompoundPaddingLeft() {
final Drawables dr = mDrawables;
if (dr == null || dr.mDrawableLeft == null) {
return mPaddingLeft;
} else {
return mPaddingLeft + dr.mDrawablePadding + dr.mDrawableSizeLeft;
}
}
这是CompoundButton中设置了复选框drawable的代码,似乎无论如何传递给TextView现在左边有一个可绘制的图像。
public void setButtonDrawable(Drawable d) {
if (d != null) {
if (mButtonDrawable != null) {
mButtonDrawable.setCallback(null);
unscheduleDrawable(mButtonDrawable);
}
d.setCallback(this);
d.setState(getDrawableState());
d.setVisible(getVisibility() == VISIBLE, false);
mButtonDrawable = d;
mButtonDrawable.setState(null);
setMinHeight(mButtonDrawable.getIntrinsicHeight());
}
refreshDrawableState();
}
所以我的问题是 CompoundButton如何设置左侧复合体的宽度?注意我对一个hack没有兴趣,因为我已经有了一个复选框。
我通过扩展textview类创建了一个自定义textview类,并让我的自定义compoundButton类扩展了它,尝试通过覆盖某些方法来确定创建复选框的间距。
它不是复合左边,而是paddingLeft,它为复选框创建了空间。当我覆盖setPadding()方法时,正在向它发送paddingLeft。这样就像在没有填充的情况下放置背景一样复选框,没有绘制复选框。
正在从textView构造函数代码
中的默认样式中读取填充a = theme.obtainStyledAttributes( attrs,com.android.internal.R.styleable.TextView,defStyle,0);
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case com.android.internal.R.styleable.TextView_editable:
editable = a.getBoolean(attr, editable);
break;
.............
由于我们无法访问正在使用的com.android.internal.R.styleable,因此我不知道如何进一步检查。
答案 0 :(得分:0)
CompoundButton
Canvas
方法似乎将onDraw()
darwable绘制到buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);
buttonDrawable.draw(canvas);
。代码显示它在左侧绘制,调整重力的高度,drawable的固有宽度按原样使用:
{{1}}