如何在不缩放可绘制对象的情况下增加自定义视图扩展按钮的填充?
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() 来查看它是什么数字
我知道在不更改 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() 来查看它是什么数字