Android OnTouchListener触屏事件接口

来源:互联网 发布:java encodeuri 编码 编辑:程序博客网 时间:2024/06/10 02:42

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

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

0 0
原创粉丝点击