运动事件的处理
触摸屏(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>
另外一个示例程序,当触摸屏按下、移动、抬起的时候,在坐标处绘制不同颜色的点,在标题栏中显示当时的动作和坐标。程序的结果如图所示:
图 触摸屏程序的运行结果
这里使用的程序如下所示:
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中还包含了多点触摸的信息,当有多个触点同时起作用的时候,可以获得触点的数目和每一个触点的坐标。