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的用法,布布扣,bubuko.com

时间: 2024-10-18 11:10:42

Android onTouchListener的用法的相关文章

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

Android multipartentity的用法

最近写一个程序,android手机端上传多个图片到asp.net服务器端,使用httpclient,在网上查到了使用multipartentity.上传测试时总是出现(500)Internal Server Error,最后查出原来是文件大小超出了服务器限制,在项目的web.config中添加: <system.web> <HttpRuntime maxRequestLength="409600"  executionTimeout="60" /&

Android之Fragment用法

本文翻译自Android developer网站上面,原文参考:Building a Dynamic UI with Fragments 当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类.Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期. 多个Fragm

Android TabHost(简易用法)

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 Tab应用的结构 TabHost的Activity的结构如下: <?xml version="1.0" encoding="utf-8"?> <!-- 定义TabHost组件 --> <LinearLayout

Android之Adapter用法总结

http://blog.csdn.net/fznpcy/article/details/8658155 Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关

Android之Adapter用法总结(转)

Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关的所有接口.类的完整层级图.在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展.比较常用

Android ListView的用法

ListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅. 程序效果是实现一个ListView,ListView里面有标题,内容和图片,并加入点击和长按响应. 首先在xml里面定义一个ListView Xml代码   <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01&quo

Android之Adapter用法总结-(转)

Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关的所有接口.类的完整层级图.在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展.比较常用

android SharedPreferences的用法

之前做应用时碰到这样一个问题:在“A” Activity 要与 “B” Activity的Fragment进行通信传值,但是忽然发现无法拿到B中Fragment的Handler,又不能发送广播,短暂的思考之后想到了SharedPreferences这个轻型的数据存储方式. SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,用Sqlite数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率.其存储位置在/dat