Android OnTouchListener触屏事件接口

OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onTouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码: <?xml version="1.0" encoding="utf-8"?> <!-- XML的版本及编码方式 --> <resources> <string name="hello">Hello World, Sample</string> <!--定义hello字符串 --> <string name="app_name">Sample</string> <!--定义app_name字符串--> <string name="location">位置</string> <!--定义location字符串--> </resources> 说明:与前面介绍的案例相同,对程序中用到的字符串资源进行定义。 开发布局文件。打开res/layout目录下的main.xml,用下列代码替换其原有代码。 Java代码: <?xml version="1.0" encoding="utf-8"?> <!-- XML的版本及编码方式 --> <AbsoluteLayout android:id="@+id/AbsoluteLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android=" http://schemas.android.com/apk/res/android"> <!-- XML的版本及编码方式 --> <Button android:layout_y="123dip" android:layout_x="106dip" android:text="@string/location" android:layout_height="wrap_content" android:id="@+id/Button01" android:layout_width="wrap_content"/> <!-- XML的版本及编码方式 --> </AbsoluteLayout> 说明:该布局文件非常简单,只是在一个绝对布局中添加一个按钮控件即可,需要注意的是应该为该按钮指定ID,以便在Java代码中可以得到该按钮的引用。 接下来开始开发主要的逻辑代码。编写Sample.java文件,其代码如下所示。 Java代码: package wyf.ytl; //声明所在包 import android.app.Activity; //引入相关类 //该处省略了部分类的引入代码,读者可以自行查阅随书光盘中的源代码\ import android.widget.Button; //引入相关类 public class Sample extends Activity { final static int WRAP_CONTENT=-2; //表示WRAP_CONTENT的常量 final static int X_MODIFY=4; //在非全屏模式下X坐标的修正值 final static int Y_MODIFY=52; //在非全屏模式下Y坐标的修正值 int xSpan; //在触控笔点击按钮的情况下相对于按钮自己坐标系的 int ySpan; //X,Y位置 public void onCreate(Bundle savedInstanceState) { //重写的onCreate方法 super.onCreate(savedInstanceState); setContentView(R.layout.main); //设置当前的用户界面 Button bok=(Button)this.findViewById(R.id.Button01); //得到按钮的引用 bok.setOnTouchListener( //添加监听 new OnTouchListener(){ //创建监听类 public boolean onTouch(View view, MotionEventevent) { //重写的监听方法 switch(event.getAction()){ //监听事件 case MotionEvent.ACTION_DOWN: //触控笔按下 xSpan=(int)event.getX(); //得到X坐标 ySpan=(int)event.getY(); //得到Y坐标 break; case MotionEvent.ACTION_MOVE: //触控笔移动 Button bok=(Button)findViewById(R.id.Button01); //让按钮随着触控笔的移动一起移动 ViewGroup.LayoutParams lp= new AbsoluteLayout.LayoutParams( WRAP_CONTENT, WRAP_CONTENT,(int)event.getRawX()-xSpan-X_MODIFY,(int)event.getRawY()-ySpan-Y_MODIFY ) ; bok.setLayoutParams(lp); //设置按钮的坐标 break; } return true; } } ); } public boolean onKeyDown (int keyCode, KeyEvent event){ //键盘键按下的方法 Button bok=(Button)this.findViewById(R.id.Button01); //得到按钮的引用 bok.setText(keyCode+" Down"); //设置按钮的文字 return true; } public boolean onKeyUp (int keyCode,KeyEvent event){ //键盘键抬起的方法 Button bok=(Button)this.findViewById(R.id.Button01); //得到按钮的引用 bok.setText(keyCode+" Up"); //设置按钮的文字 return true; } public boolean onTouchEvent (MotionEventevent){ //让按钮随触控笔的移动一起移动 Button bok=(Button)this.findViewById(R.id.Button01); //得到按钮引用 ViewGroup.LayoutParams lp= new AbsoluteLayout.LayoutParams( //创建 LayoutParams WRAP_CONTENT, WRAP_CONTENT, (int)event.getRawX()-xSpan-X_MODIFY, //X坐标 (int)event.getRawY()-ySpan-Y_MODIFY //Y坐标 ) ; bok.setLayoutParams(lp); return true; } } 第6~10行声明了程序中需要的一些变量。 第11~40行重写了Activity中的onCreate方法,在方法中设置当前的用户界面,然后得到按钮的引用并为其注册监听。第16~38行创建监听器类并重写onTouch方法,然后根据事件的类型执行不同的操作。 第41~45行重写了onKeyDown回调方法,在该方法中得到按钮的引用并设置按钮上的文字,第46~50行重写了onKeyUp回调方法,同样也是设置按钮上的文字。 第51~61行重写了onTouchEvent回调方法,用来处理屏幕事件的监听方法,在方法中得到按钮的引用,然后设置按钮的坐标。

你可能感兴趣的:(android,OnTouchListener)