为了在右侧创建一个复选框,我正在查看 Android 中的代码。但我对 android 在哪里测量复选框图标/drawable 的宽度感到困惑。
Checkbox扩展了CompoundButton类,并且仅覆盖 onPopulateAccessibilityEvent 方法。CompoundButton 类有更多代码(100 行),它扩展了Button类。按钮类几乎没有额外的代码并扩展了TextView类。TextView 类的代码量最大(10,000 行)。
这是源代码的链接
CompoundButton Web - 语法高亮 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 - 语法高亮 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/TextView.java?av=f
TextView 有一个称为复合可绘制对象的功能,您可以在其中将可绘制对象放置在文本的左侧、右侧、底部或顶部。所以我假设这是 CompoundButton 为左侧复合可绘制对象设置可绘制复选框的地方。但是在 CompoundButton 代码中我找不到这个。
但是,当我通过扩展 CompoundButton 创建自定义类并调用 getCompoundPaddingLeft() 时,它给出的宽度大约等于复选框的大小。但是,当您运行 getCompoundDrawables() 时,即使在 onDraw() 处,结果也是一个空数组。在 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 中设置了可绘制复选框的代码,似乎无论如何都没有传递给 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 如何设置左侧复合可绘制对象的宽度?请注意,我对右侧的复选框不感兴趣,因为我已经有了一个。
经进一步检查
我通过扩展 textview 类创建了一个自定义 textview 类,并让我的自定义 CompoundButton 类扩展它,以尝试通过覆盖某些方法来确定复选框间距的创建位置。
为复选框创建空间的不是 CompoundLeft 而是 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 我不知道如何进一步检查。