您的位置:首页 > 移动开发 > Android开发

Android OnTouchListener触屏事件接口

2015-08-27 23:12 441 查看
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回调方法,用来处理屏幕事件的监听方法,在方法中得到按钮的引用,然后设置按钮的坐标。

运行该案例,通过触控笔便可拖动屏幕中的按钮移动,如图所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: