我知道在不更改 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>
现在按钮扩展以匹配父级,但drawables也拉伸。我的目标是实现一个类似于原生 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;
}
...
}