如何在不缩放可绘制对象的情况下增加自定义视图扩展按钮的填充?

How to increase padding on custom view extending Button without scaling drawable?

我知道在不更改 ImageButton 上的可绘制大小的情况下设置填充更容易,但是我正在为我的自定义视图扩展 Button,因为我需要覆盖 OnTextChanged 方法(因为 Button 扩展了 TextView)。

我也尝试过以编程方式设置填充,但没有成功。

下面是我的xml部分:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/backgroundColor">

    <TableRow
        android:layout_weight="1"
        android:gravity="center">

        <org.linphone.views.Digit
            android:id="@+id/Digit1"
            style="@style/DialerDigit"
            android:background="@drawable/ws_numpad_1"
            android:soundEffectsEnabled="true"
            android:layout_weight="1"
            android:text="1"/>

        <org.linphone.views.Digit
            android:id="@+id/Digit2"
            style="@style/DialerDigit"
            android:background="@drawable/ic_num2_group"
            android:soundEffectsEnabled="true"
            android:text="2"
            android:layout_weight="1" />

        <org.linphone.views.Digit
            android:id="@+id/Digit3"
            style="@style/DialerDigit"
            android:background="@drawable/ic_num3_group"
            android:soundEffectsEnabled="true"
            android:text="3"
            android:layout_weight="1" />

    </TableRow>

现在,按钮会扩展以匹配父级,但可绘制对象也会扩展。我的目标是实现一个类似于原生 android 的拨号盘(即数字之间没有间隙,拨号盘上的数字不会因不同的屏幕尺寸而失真)。

编辑 1(添加了拨号盘图像):

编辑 2(拨号盘侦听器实现):

@Override
    protected void onTextChanged(CharSequence text, int start, int before, int after) {
        super.onTextChanged(text, start, before, after);

        if (text == null || text.length() < 1) {
            return;
        }

        DialKeyListener lListener = new DialKeyListener();
        setOnClickListener(lListener);
        setOnTouchListener(lListener);

        // Assign button long clicks here
        if ("0".equals(text.toString())) { // This was 0+, but they were separated, hence
            // changed to 0 only
            setOnLongClickListener(lListener);
        }

        if ("1".equals(text.toString())) {
            setOnLongClickListener(lListener);
        }
    }
private class DialKeyListener implements OnClickListener, OnTouchListener, OnLongClickListener {
        final char mKeyCode;
        boolean mIsDtmfStarted;

        DialKeyListener() {
            mKeyCode = Digit.this.getText().subSequence(0, 1).charAt(0);
        }

        private boolean linphoneServiceReady() {
            if (!LinphoneContext.isReady()) {
                Log.e("[Numpad] Service is not ready while pressing digit");
                return false;
            }
            return true;
        }
   ...
}

因为您正在使用按钮自定义视图并定义背景,所以按钮的大小将是您作为背景放置的可绘制对象的大小。

现在您只需更改您的自定义视图以扩展 ImageButton 而不是 Button,您就可以让它像这样工作 -

   <TableRow
        android:layout_weight="1"
        android:gravity="center">

        <ImageButton
            android:id="@+id/Digit1"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:src="@drawable/ic_num1_group"
            android:tag="1" />

        <ImageButton
            android:id="@+id/Digit2"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:soundEffectsEnabled="true"
            android:src="@drawable/ic_num2_group"
            android:tag="2" />

        <ImageButton
            android:id="@+id/Digit3"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:soundEffectsEnabled="true"
            android:src="@drawable/ic_num3_group"
            android:tag="3" />

    </TableRow>

如果您想在更改为 ImageButton 后保留您的实现,唯一的区别是 -

除了在 onTextChange 回调中启动侦听器之外,您还可以在创建视图后调用的 initListeners() 方法中执行此操作,并将其自身添加到所需的侦听器中 -

private void initListeners() {
    DialKeyListener lListener = new DialKeyListener();
    setOnClickListener(lListener);
    setOnTouchListener(lListener);
    setOnLongClickListener(lListener);

    // Assign button long clicks here
    if (Digit.this.getTag().toString().equals("0")) { 
        setOnLongClickListener(lListener);
    }

    if (Digit.this.getTag().toString().equals("1")) {
        setOnLongClickListener(lListener);
    }
}

而不是从您放入 xml 的按钮的文本中获取被点击的按钮的编号,您可以使用完全相同的方式使用标签。

我在上面的 xml 示例中添加了标签,然后一旦您在 onClick 回调中有了视图,您就可以使用 getTag() 来查看它是什么数字