按下时如何将文本居中放置在图像上方?
How to center a text above an image when pressed?
我正在尝试使用 Android Studio 编写一个应用程序,我希望按钮具有自定义背景,按下时会发生变化。我的实际代码是这样的:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/new_game_button_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/new_game_button" />
<item android:drawable="@drawable/new_game_button" />
</selector>
现在,我想在该图像上添加一个文本,该文本会更改其在图像中的位置,以便在按下时始终适合中心。
按钮正常:
按下按钮:
我该怎么做?
从现在开始我一直在使用 ImageButtons 但它没有派上用场,因为我必须为每个按钮(正常和按下)制作两个文件,硬编码其中的文本,然后制作另外两个文件用于我想要的每种语言。
在此先感谢您的支持!
您走在正确的轨道上,每个状态都有不同的可绘制对象(注意 - 您的焦点状态与默认状态相同)。
您可以使用常规的 TextView,并在其上设置背景。然后当你在 TextView 上设置了点击监听器时,当你按下它时它会改变背景。
要使用 state_focused
,您必须使 TextView
可聚焦。
使用带有自定义背景可绘制对象的 Button
,类似于您的选择器。按钮显示居中文本,默认情况下可聚焦。
如果您的背景图片是九色补丁,它们可能包含填充信息。使用正确的填充信息,文本将正确居中:
http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch
我解决了这个问题,创建了另一个继承自 Button 的 class:
package com.mycompany.myapp.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;
import android.view.MotionEvent;
import com.mycompany.myapp.R;
public class BlueOffsetButton extends Button {
public BlueOffsetButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public BlueOffsetButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BlueOffsetButton(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
//If not clickable
if(!this.isClickable()){
//Do nothing
return value;
}
//If clickable
//If the button needs to go up (released)
if (event.getAction() == MotionEvent.ACTION_UP) {
//Set the proper background
setBackgroundResource(R.drawable.blue_button_normal);
//Restore the initial padding (0, 0, 0, 0)
setPadding(getPaddingLeft(), getPaddingTop() - 10, getPaddingRight(), getPaddingBottom() + 10);
}
//If the button needs to go down (pressed)
else if (event.getAction() == MotionEvent.ACTION_DOWN) {
//Set the proper background
setBackgroundResource(R.drawable.blue_button_pressed);
//Set the proper padding to center the text (0, 10, 0, -10)
setPadding(getPaddingLeft(), getPaddingTop() + 10, getPaddingRight(), getPaddingBottom() - 10);
}
return value;
}
}
然后以这种方式在任何需要按钮的地方使用它:
<com.mycompany.myapp.widgets.BlueOffsetButton
style="@style/BlueButton"
android:id="@+id/newGameButton"
android:layout_above="@+id/settingsButton"
android:text="@string/new_game_button_text"
android:onClick="onClickNewGame" />
我正在尝试使用 Android Studio 编写一个应用程序,我希望按钮具有自定义背景,按下时会发生变化。我的实际代码是这样的:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/new_game_button_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/new_game_button" />
<item android:drawable="@drawable/new_game_button" />
</selector>
现在,我想在该图像上添加一个文本,该文本会更改其在图像中的位置,以便在按下时始终适合中心。
按钮正常:
按下按钮:
我该怎么做?
从现在开始我一直在使用 ImageButtons 但它没有派上用场,因为我必须为每个按钮(正常和按下)制作两个文件,硬编码其中的文本,然后制作另外两个文件用于我想要的每种语言。
在此先感谢您的支持!
您走在正确的轨道上,每个状态都有不同的可绘制对象(注意 - 您的焦点状态与默认状态相同)。
您可以使用常规的 TextView,并在其上设置背景。然后当你在 TextView 上设置了点击监听器时,当你按下它时它会改变背景。
要使用 state_focused
,您必须使 TextView
可聚焦。
使用带有自定义背景可绘制对象的 Button
,类似于您的选择器。按钮显示居中文本,默认情况下可聚焦。
如果您的背景图片是九色补丁,它们可能包含填充信息。使用正确的填充信息,文本将正确居中: http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch
我解决了这个问题,创建了另一个继承自 Button 的 class:
package com.mycompany.myapp.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;
import android.view.MotionEvent;
import com.mycompany.myapp.R;
public class BlueOffsetButton extends Button {
public BlueOffsetButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public BlueOffsetButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BlueOffsetButton(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
//If not clickable
if(!this.isClickable()){
//Do nothing
return value;
}
//If clickable
//If the button needs to go up (released)
if (event.getAction() == MotionEvent.ACTION_UP) {
//Set the proper background
setBackgroundResource(R.drawable.blue_button_normal);
//Restore the initial padding (0, 0, 0, 0)
setPadding(getPaddingLeft(), getPaddingTop() - 10, getPaddingRight(), getPaddingBottom() + 10);
}
//If the button needs to go down (pressed)
else if (event.getAction() == MotionEvent.ACTION_DOWN) {
//Set the proper background
setBackgroundResource(R.drawable.blue_button_pressed);
//Set the proper padding to center the text (0, 10, 0, -10)
setPadding(getPaddingLeft(), getPaddingTop() + 10, getPaddingRight(), getPaddingBottom() - 10);
}
return value;
}
}
然后以这种方式在任何需要按钮的地方使用它:
<com.mycompany.myapp.widgets.BlueOffsetButton
style="@style/BlueButton"
android:id="@+id/newGameButton"
android:layout_above="@+id/settingsButton"
android:text="@string/new_game_button_text"
android:onClick="onClickNewGame" />