運動事件的處理

觸摸屏(TouchScreen)和滾動球(TrackBall)是Android中除了鍵盤以外的主要輸入設備。若是須要使用觸摸屏和滾動球,主要能夠經過使用運動事件(MotionEvent)用於接收它們的信息。
觸摸屏和滾動球事件主要經過實現如下2個函數來接收:
public boolean onTouchEvent(MotionEvent event)
public boolean onTrackballEvent(MotionEvent event)
在以上2個函數中,MotionEvent類做爲參數傳入,在這個參數中能夠得到運動事件的各類信息。
本例介紹另外觸摸屏事件的程序,這個程序在UI的界面中,顯示當前的MotionEvent的動做和位置。
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
圖觸摸屏程序的運行結果
本例的程序的代碼以下所示:
package com.android.basicapp;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;
public class TestMotionEvent extends Activity {
private static final String TAG = "TestMotionEvent";
TextView mAction;
TextView mPostion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testmotionevent);
mAction = (TextView)findViewById(R.id.action);
mPostion = (TextView)findViewById(R.id.postion);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int Action = event.getAction();
float X = event.getX();
float Y = event.getY();
Log.v(TAG, "Action = "+ Action );
Log.v(TAG, "("+X+","+Y+")");
mAction.setText("Action = "+ Action);
mPostion.setText("Postion = ("+X+","+Y+")");
return true;
}
}
佈局文件testmotionevent.xml的內容以下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:id="@+id/action"
android:textSize = "20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/postion"
android:textSize = "20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>linux

另一個示例程序,當觸摸屏按下、移動、擡起的時候,在座標處繪製不一樣顏色的點,在標題欄中顯示當時的動做和座標。程序的結果如圖所示:
圖 觸摸屏程序的運行結果
這裏使用的程序以下所示:
package com.android.basicapp;
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class TestMotionEvent2 extends Activity {
private static final String TAG = "TestMotionEvent2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TestMotionView(this));
}
public class TestMotionView extends View {
private Paint mPaint = new Paint();
private int mAction;
private float mX;
private float mY;
public TestMotionView(Context c) {
super(c);
mAction = MotionEvent.ACTION_UP;
mX = 0;
mY = 0;
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
canvas.drawColor(Color.WHITE);
if(MotionEvent.ACTION_MOVE == mAction) { // 移動動做
paint.setColor(Color.RED);
}else if(MotionEvent.ACTION_UP == mAction) { // 擡起動做
paint.setColor(Color.GREEN);
}else if(MotionEvent.ACTION_DOWN == mAction) { // 按下動做
paint.setColor(Color.BLUE);
}
canvas.drawCircle(mX, mY,10, paint);
setTitle("A = " + mAction + " ["+ mX +","+ mY +"]");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mAction = event.getAction(); // 得到動做
mX = event.getX(); // 得到座標
61
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
62
mY = event.getY();
Log.v(TAG, "Action = "+ mAction );
Log.v(TAG, "("+mX+","+mY+")");
invalidate(); // 從新繪製
return true;
}
}
}
在程序中,在觸摸屏事件到來以後,接收到它,而且紀錄發生事件的座標和動做,而後調用invalidate()從新進行繪製。繪製在onDraw()中完成,根據不一樣的事件,繪製不一樣顏色的點,並設置標題欄。
MotionEvent是用於處理運動事件的類,這個類中能夠得到動做的類型、動做的座標,在Android 2.0版本以後,MotionEvent中還包含了多點觸摸的信息,當有多個觸點同時起做用的時候,能夠得到觸點的數目和每個觸點的座標。android

相關文章
相關標籤/搜索