参考android官网:https://developer.android.com/reference/android/widget/ImageButton
一、 ImageView介绍
ImageButton由ImageView派生而来(非继承自Button),ImageButton是显示图片的图像按钮。
ImageButton的图像由XML 中的属性元素android:src
指定
或方法 ImageView.setImageResource(int)
。
如要删除标准按钮背景图像,请自定义背景图像或将背景颜色设置为透明。
要指示不同的按钮状态(聚焦、选择等),可以为每个状态定义不同的图像。例如,默认情况下为蓝色图像,聚焦时为橙色图像,按下时为黄色图像。实现此目的的一个简单方法是使用 XML 可绘制“选择器”。例如:
<?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/button_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_focused" /> <!-- focused -->
<item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>
将 XML 文件保存在项目res/drawable/
文件夹中,然后将其引用为 ImageButton 源的可绘制对象(在属性中 android:src
)。Android 会根据按钮的状态和 XML 中定义的相应图像自动更改图像。
元素的顺序<item>
很重要,因为它们是按顺序求值的。这就是为什么“正常”按钮图像出现在最后,因为它只会在之后应用android:state_pressed
并且android:state_focused
都被评估为 false。
请参阅Buttons 指南。
ImageButton和Button之间的区别有:
- Button既可显示文本也可显示图片,ImageButton只能显示图片不能显示文本。
- ImageButton上的图像可按比例缩放,而Button通过背景设置的图像会拉伸变形。
- Button只能靠背景显示一张图片,而ImageButton可分别在前景和背景显示图片,从而实现两张图片叠加的效果。
ImageButton的使用场合:在某些场合,有的字符无法由输入法打出来,或者某些文字以特殊字体展示,就适合使用ImageButton。例如:如特殊的数学公式符号等。
ImageButton与ImageView之间的区别有:
- ImageButton有默认的按钮背景,ImageView默认无背景。
- ImageButton默认的缩放类型为center,而ImageView默认的缩放类型为fitCenter。
二、ImageButton同时展示文本与图像
同时展示文本与图像的可能途径包括:
- 利用LinearLayout对ImageView和TextView组合布局。
- 通过按钮控件Button的drawable***属性设置文本周围的图标。
属性 | 描述 |
drawableTop | 指定文字上方的图片 |
drawableBottom | 指定文字下方的图片 |
drawableLeft | 指定文字左边的图片 |
drawableRight | 指定文字右边的图片 |
drawablePadding | 指定图片与文字的间距 |
mTextView = (TextView) findViewById(R.id.textView);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string = String.format("%s: 你点击了按键:%s",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextView.setText(string);
}
});
或者
mTextView = (TextView) findViewById(R.id.textView);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new MyOnClickListener());
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
String string = String.format("%s: 你点击了按键:%s",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextView.setText(string);
}
}
但是如果一个activity中有许多按键,给每一个按键都定义自己的监听器,非常的费时费力。
更好的方法的注册统一的监听,在当前activity实现View.OnClickListener接口
public class MainActivity extends AppCompatActivity
implements View.OnClickListener {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
mTextView = (TextView) findViewById(R.id.textView);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button) {
String string = String.format("%s: 你点击了按键:%s",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextView.setText(string);
}
}
}
-
设置长按事件监听
按键按住超过500ms,触发长按事件,和设置点击事件类似,可通过setOnLongClickListener方法设置长按监听,具体代码如下:
public class MainActivity extends AppCompatActivity
implements View.OnLongClickListener {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonLongClick = (Button) findViewById(R.id.longClickButton);
buttonLongClick.setOnLongClickListener(this);
mTextView = (TextView) findViewById(R.id.textView);
}
@Override
public boolean onLongClick(View v) {
if (v.getId() == R.id.longClickButton) {
String string = String.format("%s: 你长按了按键:%s",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextView.setText(string);
return true;
}
return false;
}
}
三、Button的禁用与恢复
在实际业务中,按钮通常拥有两种状态,即不可用状态与可用状态,它们在外观和功能上的区别如下:
(1)不可用按钮:按钮不允许点击,即使点击也没反应,同时按钮变为灰色;
(2)可用按钮:按钮允许点击,点击按钮会触发点击事件;
可以通过xml的android:enabled属性和Java Button控件的setEnabled方法控制。
-
xml:android:enabled属性值为true时表示允许点击,为false时表示不允许点击。
<Button
android:id="@+id/button_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:enabled="false"
android:text="测试按键" />
-
Java:Button控件的setEnabled()方法控制
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButtonEnable, mButtonDisable, mButtonTest;
private TextView mTextViewForTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate: " + Utils.getNowDateTime());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启用、禁用测试
mButtonEnable = (Button) findViewById(R.id.button_enable);
mButtonDisable = (Button) findViewById(R.id.button_disable);
mButtonTest = (Button) findViewById(R.id.button_test);
mButtonEnable.setOnClickListener(this);
mButtonDisable.setOnClickListener(this);
mButtonTest.setOnClickListener(this);
mTextViewForTest = (TextView) findViewById(R.id.textViewForTest);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button_enable) {
String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextViewForTest.setText(string);
mButtonTest.setEnabled(true);
} else if (v.getId() == R.id.button_disable) {
String string = String.format("%s: 你点击了按键:%s, 请观察【测试按键】的状态",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextViewForTest.setText(string);
mButtonTest.setEnabled(false);
} else if (v.getId() == R.id.button_test) {
String string = String.format("%s: 你点击了按键:%s",
Utils.getNowTimeMs(), ((Button) v).getText());
mTextViewForTest.setText(string);
}
}
}
四、Button控件测试程序
java:
MainActivity.java
四、测试程序
完整源码
百度网盘链接:百度网盘 请输入提取码 提取码:test
ActivityLifecycleTest目录