android之DPAD上下左右四個鍵控制

來源:互聯網
上載者:User

我們代碼的目的很簡單,那就是監聽上下左右中這幾個鍵的事件觸發。直接上代碼:

dpad.xml

<?xml version="1.0" encoding="utf-8"?><br /><AbsoluteLayout<br /> xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> android:background="#FFFFFF"<br /> ><br /> <Button<br /> android:id="@+id/myButton1"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:text="move me"<br /> android:layout_x="20px"<br /> android:layout_y="40px" /><br /></AbsoluteLayout><br />

activity代碼:

package cn.com.chenzheng_java;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.DisplayMetrics;<br />import android.view.KeyEvent;<br />import android.widget.AbsoluteLayout;<br />import android.widget.Button;<br />import android.widget.Toast;<br />/**<br /> * @description 控制手機的上下左右四個方向鍵<br /> * @author chenzheng_java<br /> *<br /> */<br />public class DpadActivity extends Activity {<br />Button button;<br />DisplayMetrics metrics = new DisplayMetrics();<br />int screenx = 0 ;//螢幕寬度<br />int screeny = 0 ;//螢幕高度<br />int buttonWidth = 80;//按鈕寬度<br />int buttonHeight = 40 ;// 按鈕高度<br />int currentX = 0;// 按鈕的當前x座標<br />int currentY = 0;// 按鈕的當前Y座標<br />int step = 0;//移動時候的步長<br />@Override<br />protected void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.dpad);<br />button = (Button) findViewById(R.id.myButton1);<br />getWindowManager().getDefaultDisplay().getMetrics(metrics);<br />screenx = metrics.widthPixels;<br />screeny = metrics.heightPixels;<br />/*buttonWidth = button.getWidth();<br />buttonHeight = button.getHeight();*/</p><p>currentX = (screenx-buttonWidth)/2;<br />currentY = (screeny-buttonHeight)/2;<br />step = 2;</p><p>button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY));</p><p>}</p><p>/**<br /> * 當前後左右鍵被按下的時候,被觸發(這裡可是有前提的哦,那就是當前的activity中必須沒有view正在監聽按鍵<br /> * ,例如:當前如果有一個EditText正在等待輸入,當我們按下dpad時,不會觸發事件哦)<br /> * Activity.onKeyDown();<br />當某個鍵被按下時會觸發,但不會被任何的該Activity內的任何view處理。<br />預設按下KEYCODE_BACK鍵後會回到上一個Activity。<br /> */<br />@Override<br />public boolean onKeyDown(int keyCode, KeyEvent event) {<br />switch (keyCode) {<br />case KeyEvent.KEYCODE_DPAD_DOWN://按向下鍵<br />moveDown();<br />break;<br />case KeyEvent.KEYCODE_DPAD_UP:// 按向上鍵<br />moveUp();<br />case KeyEvent.KEYCODE_DPAD_LEFT://按向左鍵<br />moveLeft();<br />case KeyEvent.KEYCODE_DPAD_RIGHT://按向右鍵<br />moveRight();<br />default:<br />break;<br />}</p><p>return super.onKeyDown(keyCode, event);<br />}</p><p>@SuppressWarnings("deprecation")<br />private void moveDown(){<br />int temp = currentY+step;<br />if(temp>(screeny-buttonHeight)){<br />showToast("到頭了哦!");<br />button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, screeny-buttonHeight));<br />}<br />else{<br />currentY = currentY+step;<br />AbsoluteLayout.LayoutParams params =<br />new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);<br />button.setLayoutParams(params);</p><p>}<br />//button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY-2));</p><p>}</p><p>@SuppressWarnings("deprecation")<br />private void moveUp(){<br />int temp = currentY-step;<br />if(temp<=0){<br />showToast("往上到頭了哦!");<br />button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, 0));<br />}<br />else{<br />currentY = currentY-step;<br />AbsoluteLayout.LayoutParams params =<br />new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);<br />button.setLayoutParams(params);<br />}</p><p>}</p><p>@SuppressWarnings("deprecation")<br />private void moveLeft(){<br />int temp = currentX-step;<br />if(temp<=0){<br />showToast("往左邊到頭了哦!");<br />button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, 0, screeny));<br />}<br />else{<br />currentX = currentX-step;<br />AbsoluteLayout.LayoutParams params =<br />new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);<br />button.setLayoutParams(params);<br />}</p><p>}</p><p>@SuppressWarnings("deprecation")<br />private void moveRight(){<br />int temp = currentX+step;<br />if(temp>=(screenx-buttonWidth)){<br />showToast("往右邊到頭了哦!");<br />button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx-buttonWidth, currentY));<br />}<br />else{<br />currentX = currentX+step;<br />AbsoluteLayout.LayoutParams params =<br />new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);<br />button.setLayoutParams(params);<br />}</p><p>}</p><p>/**<br /> * 彈出提示資訊<br /> * @param text 提示資訊<br /> */<br />private void showToast(String text){<br />Toast.makeText(this, text, Toast.LENGTH_LONG).show();</p><p>}</p><p>}<br />

---------------------------------------------------------------------------------------

       這裡我們可以看到,要想監聽這幾個方向鍵,那麼我們必須重寫 public boolean onKeyDown(int keyCode, KeyEvent event)這個方法,該方法定義在Activity中,其中keyCode便是代表著你點擊的那個鍵的標識符,KeyEvent 則是一個事件。

      需要注意的是,座標問題:我們控制的按鈕的座標實際上是左上方的座標。而螢幕的向左是X軸,向下是Y軸,也就是說,只要在螢幕內顯示的組件,其座標都是正數的。

     當然鍵盤中所有的鍵都可以監聽的,我們亦可以來監聽A-Z這些鍵,他們的keyCode依次是KEYCODE_A -------KEYCODE_Z.

     這裡有一個小技巧,可以判斷出使用者輸入的是什麼A-Z那個字元,代碼如下:

int code = 'A'+keycode-29;<br />char ch = (char)code;<br />

如果我們無法擷取當前的按鍵,我們可以通過keycode_unknown來捕捉。

控制音量大小:keycode_volume_down / keycode_volume_up.

-----------------------------------------------------------------------------------------

關於KeyEvent,它代表了我們點擊鍵盤時的事件,看,我們可以建立自己的鍵盤事件

其中參數中的action,代表了使用者的操作,值為ACTION_DOWN、ACTION_UP、ACTION_MULTIPLE其中的一個。而code則代表了我們的標識符,入上面提到的keycode_volume_down 就是一個code。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.