按鈕 Button/ImageButton
1. Button 的基本用法
Button,顧名思義,就是一個提供給使用者點選的控制元件。同 EditText 一樣,它也是繼承自 TextView,擁有 TextView 的全部屬性,這裡重點講講 Button 特有的及常用的屬性的用法。
下面我們通過 XML 定義了一個 Button:
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/btn_click"
android:layout_width="match_parent"
android:layout_height ="wrap_content"
android:text="點我"
android:onClick="onClick"
android:textColor="@android:color/holo_blue_dark" />
基本用法和 TextView 類似,這裡多了一個android:onClick
屬性,從名字上看應該是設定一個點選事件。那麼我們首先看看 Button 最重要的功能,如何給 Button 繫結點選事件接收器,從而完成 Button 點選事件的接收及處理。
2. 點選事件的繫結
2.1 靜態繫結
第一種方式是通過onClick
屬性實現,xml 佈局程式碼如上。我們需要給onClick
onClick
的方法,如下:
public void onClick(View v) {
Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();
}
這裡要特別注意函式簽名,需要指定為public void
型別,而入參是View
型別,傳入的 View 就是被點選的 Button 物件。這樣我們可以給多個 Button 繫結同一個 click 函式,然後通過傳入的 View 來區分點選是哪個 Button 被點選從而執行相應操作。
執行之後,點選 Button 效果如下:
點選之後在螢幕下方打印出的文字就是我們在 xml 中為 Button 設定的 id,從而可以確認兩件事:
- 通過
onClick
屬性,我們可以為 Button 指定一個點選相應函式,按照指定的方法簽名實現這個響應函式,即可接收點選事件; - 點選 Button 之後,會將被點選的 Button 通過引數的形式傳給
onClick
函式。
2.2 動態繫結
通過xml的onClick
屬性靜態繫結的方式不夠靈活,而且要求繫結的函式名、引數等完全一致,出錯率也比較高,所以在實際開發中用的很少,絕大多數場景都會通過 Java 程式碼動態繫結一個事件監聽器。
動態繫結監聽器的主要程式碼如下:
package com.emercy.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.btn_click);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();
}
});
}
}
如果你對 Activity 還比較生疏也沒關係,在後面的課程會詳細講解,這裡重點看看和 Button 有關的程式碼。
- 首先我們設定佈局檔案為只含有一個 Button 的 xml 檔案;
- 接著通過 ID 獲取到 Button 例項;
- 通過
setOnClickListener
函式設定一個點選事件監聽器; - 在監聽器的 onClick 回撥中接收點選事件並處理。
通過以上程式碼可以達到同樣的效果,在onClick(View view)
回撥中傳入的 View 同樣是被點選的Button物件,在回撥中可以由不同的 ID 區分不同的處理邏輯。這是 Button 最常用的方式,必須掌握。
3. Button 的樣式
不同的系統會有不同的預設 Button 樣式,但是它們都有一個共同點——醜。相比於 TextView 而言,Button 是一個互動感很強的控制元件,除了設定字型字號,還需要有形狀、背景、顏色、點選態等等樣式變化。特別是在遊戲及娛樂類 App 中 ,Button 的樣式及變化效果將直接影響使用者體驗,所以這裡將重點講解幾種設定樣式的方法。
3.1 設定背景
可以有兩種設定方式:1、設定背景色;2、設定背景圖。兩種方式都可以通過 xml 及 Java 設定,在 xml 中可以通過:
android:background="#E4BB18"
可以直接設定顏色或者背景圖片,也可以在 Java 程式碼中通過如下兩個介面實現:
setBackground();
setBackgroundResource();
3.2 設定形狀樣式
和 TextView 類似,我們首先建立 drawable 資源:
依次進入“src” -> “main” -> “res” -> “drawable”目錄,在裡面右鍵新建一個“Drawable Resource File”,輸入檔名:button_background。
編寫 button_background.xml 的內容如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#B9B911" />
<corners
android:bottomLeftRadius="30dp"
android:bottomRightRadius="30dp"
android:topLeftRadius="30dp"
android:topRightRadius="30dp" />
<stroke
android:width="3dp"
android:color="#99CCFF" />
</shape>
在 shape 標籤中,我們設定了
- 填充的背景色
- 拐角的弧度
- 描邊的顏色和寬度
然後在xml中通過android:background
設定 button 的 background 樣式:
android:background="@drawable/button_background"
效果如下:
3.3 多狀態變化
Button 的多狀態變化是很常用也是效果非常棒的一個效果,它的可以最大化的增強互動感。通過 StateListDrawable 設定 Button 在不同狀態下的樣式效果,比如在按下、抬起、選中、無效等等不同狀態下可以呈現不同的形狀和顏色,這樣可以給使用者更多的點選反饋。
StateListDrawable 用來記錄各個狀態列表,並通過 Drawable 的形式描述各個狀態下要呈現的樣式。它支援以下設定項:
- drawable: Button 的背景樣式,搭配後面的狀態使用表示當前狀態下的樣式。如果沒有設定狀態,則為預設樣式
- state_pressed: 按下態
- state_enabled: 可用狀態
- state_focused: 獲得焦點狀態
- state_window_focused: 獲得視窗焦點狀態
- state_checkable: 可選狀態(針對 checkbox)
- state_checked: 勾選態
- state_selected: 選擇態(針對滾輪的場景)
- state_active: 活動狀態(針對 slidingTab)
- state_single: 包含多個子控制元件時,只顯示一個子控制元件的狀態
- state_first: 包含多個子控制元件時,第一個子控制元件處於顯示狀態
- state_middle: 包含多個子控制元件時,中間一個子控制元件處於顯示狀態
- state_last: 包含多個子控制元件時,最後一個子控制元件處於顯示狀態
其中最常用就是前 3 個狀態。
我們新增一個 button_pressd_background.xml,內容如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#DF866B" />
<corners
android:bottomLeftRadius="50dp"
android:bottomRightRadius="50dp"
android:topLeftRadius="50dp"
android:topRightRadius="50dp" />
<stroke
android:width="3dp"
android:color="#99CCFF" />
</shape>
我們在之前的樣式上修改了定點的弧度及背景顏色,希望他在點選的時候能夠變成新的樣式,接下來還需要一個 StateListDrawable 檔案。我們仍然在 drawable 目錄下建立檔案:button_selector.xml
,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressd_background" android:state_pressed="true" />
<item android:drawable="@drawable/button_background" />
</selector>
這裡採用<selector/>
標籤,直譯過來就是“選擇器”,即在不同狀態下選擇哪種樣式。最後我們將 Button 的android:background
屬性指向 button_selector.xml 檔案:
android:background="@drawable/button_selector"
大功告成,這時候只需要輕輕點選 Button,就會發現神奇的現象:
這樣是不是更有互動感?採用 StateListDrawable 還可以指定很多的狀態變化,這裡就留給大家去發明創造。
4 小結
本節講解了 Button 的基本用法,其中最核心的就是設定點選事件監聽器來接收使用者點選事件,其實在我們日常的實戰開發中,不僅僅是 Button 可以繫結監聽器,TextView、EditText 都可以,感興趣的小夥伴也可以嘗試修改前幾節的例子,加上監聽器試試,希望大家在學習每一個 View 的時候都能夠融會貫通,舉一反三。