3

为了在右侧创建一个复选框,我正在查看 Android 中的代码。但我对 android 在哪里测量复选框图标/drawable 的宽度感到困惑。

Checkbox扩展了CompoundButton类,并且仅覆盖 onPopulateAccessibilityEvent 方法。CompoundButton 类有更多代码(100 行),它扩展了Button类。按钮类几乎没有额外的代码并扩展了TextView类。TextView 类的代码量最大(10,000 行)。

这是源代码的链接

复选框 http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/CheckBox.java/?v=source

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

原始(更快查看) http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/CompoundButton.java/?v=source

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

原始(更快查看) http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/widget/TextView.java/?v=source

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 我不知道如何进一步检查。

4

1 回答 1

0

onDraw()方法CompoundButton似乎吸引mButtonDrawable了 darwable 到Canvas. 代码显示它被绘制在左侧调整重力高度,drawable的固有宽度按原样使用:

buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);
buttonDrawable.draw(canvas);
于 2013-01-14T07:03:33.517 回答