zoukankan      html  css  js  c++  java
  • 运动事件的处理

    触摸屏(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中还包含了多点触摸的信息,当有多个触点同时起作用的时候,可以获得触点的数目和每一个触点的坐标。

  • 相关阅读:
    友链
    OI日常
    P4451 [国家集训队]整数的lqp拆分 生成函数
    AT4831 [ABC155F] Perils in Parallel 生成树
    P4438 [HNOI/AHOI2018]道路 树DP
    CF383E Vowels 子集DP 容斥
    P5488 差分与前缀和 生成函数+多项式EXP
    CF115E Linear Kingdom Races 线段树优化DP
    CF49E Common ancestor 区间DP
    P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II 莫队二次离线
  • 原文地址:https://www.cnblogs.com/ruiati/p/3314237.html
Copyright © 2011-2022 走看看