Android OnTouchListener触屏事件接口
ontouchevent用法

ontouchevent用法
ontouchevent是Android中一个重要的触摸事件的处理函数,它在View和ViewGroup中都可以使用。
当用户在屏幕上触摸时,ontouchevent函数将被调用,以便开发人员可以对其进行响应。
ontouchevent函数所接受的参数包括MotionEvent对象,它是一个表示触摸事件的类,包括触摸点的坐标、时间戳、触摸类型等信息。
ontouchevent函数应该返回一个布尔值,表示是否消耗了该事件。
如果返回true,则表示已经处理了该事件,不会再传递给其他View或ViewGroup;如果返回false,则表示该事件仍然可以传递给其他View或ViewGroup进行处理。
在使用ontouchevent函数时,开发人员可以根据需要实现不同的处理逻辑。
例如,可以根据触摸点的坐标计算出相应的滑动距离,实现触摸滑动效果;也可以根据触摸点的类型实现不同的响应,如长按、双击等操作。
除了ontouchevent函数以外,Android还提供了一些其他的触摸事件处理函数,如onTouchEvent、dispatchTouchEvent等,开发人员可以根据需要选择使用。
在实际开发中,需要注意多个View或ViewGroup之间的事件处理顺序,以及事件的传递和消耗,以避免出现意外的效果。
- 1 -。
移动端jstouch事件

移动端jstouch事件随着智能⼿机和平板电脑的普及, 越来越多的⼈⽤移动设备浏览⽹页,我们平时在pc浏览器上⽤的⿏标事件,⽐如:click, mouseover等,已经⽆法满⾜移动设备触摸屏的特点,触摸时代的到来,离不开那些触摸事件。
触摸事件包含4个接⼝。
TouchEvent代表当触摸⾏为在平⾯上变化的时候发⽣的事件.Touch代表⽤户⼿指与触摸平⾯间的⼀个接触点.TouchList代表⼀系列的Touch; ⼀般在⽤户多个⼿指同时接触触控平⾯时使⽤这个接⼝.DocumentTouch包含了⼀些创建 Touch对象与TouchList对象的便捷⽅法.TouchEvent接⼝可以响应基本触摸事件(如单个⼿指点击),它包含了⼀些具体的事件,事件类型:touchstart : 触摸开始(⼿指放在触摸屏上)touchmove: 拖动(⼿指在触摸屏上移动)touchend : 触摸结束(⼿指从触摸屏上移开)touchenter :移动的⼿指进⼊⼀个dom元素。
touchleave :移动的⼿指离开⼀个dom元素。
还有⼀个touchcancel,是在拖动中断时候触发。
事件属性:altKey : 该属性返回⼀个布尔值,表⽰在指定的事件发⽣时,Alt 键是否处于按下状态, event.altKey=true|false|1|0type : 触摸时触发的事件类型,⽐如touchstart每个触摸事件都包括了三个触摸属性列表:1. touches:当前位于屏幕上的所有⼿指触摸点的⼀个列表。
2. targetTouches:当前元素对象上所有触摸点的列表。
3. changedTouches:涉及当前事件的触摸点的列表。
它们都是⼀个数组,每个元素代表⼀个触摸点。
每个触摸点对应的Touch都有三对重要的属性,clientX/clientY、pageX/pageY、screenX/screenY。
其中screenX/screenY代表事件发⽣的位置对于屏幕的偏移量,clientX/clienYt和pageX/pageY都代表事件发⽣位置对应对象的偏移量,不过区别是clientX/clientY不包括对象滚动⽽隐藏的偏移量,⽽pageX/pageY包括对象滚动⽽隐藏的偏移量。
Android的Button按钮,ACTION_UP事件不触发解决方案

Android的Button按钮,ACTION_UP事件不触发解决⽅案在android 编程时,有时候要实现当Button⼀直按下的时候,执⾏⼀些逻辑代码,当按钮弹起的时候,终⽌这些逻辑代码的执⾏。
⽐如在设置页⾯的滑动开关时,如果不监听ACTION_CANCEL,在滑动到中间时,如果你⼿指上下移动,就是移动到开关控件之外,就会造成开关的按钮停顿在中间位置。
在⼀般情况下,实现这个逻辑需要注册OnTouchListener监听,OnTouchListener的OnTouch⽅法中代码如下:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;}在⼀般情况下,这样写是没有问题的,但是当⼿指快速滑过这个Button时,就会发现只触发了ACTION_DOWN时间,没有触发ACTION_UP,就会导致,按钮按下的逻辑代码⼀直会执⾏。
当焦点移动到件之外,此时会触发ACTION_CANCEL,⽽不是ACTION_UP,造成按下的逻辑⼀直会执⾏。
为了解决这个问题,上述代码可以需要修改为:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;case MotionEvent.ACTION_CANCEL://按钮弹起逻辑break;}ACTION_UP处理的是在Button原位置弹起,ACTION_CANCEL处理的是焦点离开Button,两者都需要处理,才能解决这个问题。
⽰例(我这个是在按下的时候,让按钮放⼤,⼿抬起的时候缩⼩操作):login_with_sina.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("++++++key_down");AnimUtil.showOnFocusAnimation(login_with_sina);break;case MotionEvent.ACTION_UP:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;case MotionEvent.ACTION_CANCEL:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;}return true;}});。
android 触摸事件、点击事件的区别

}
}
…
break;
可以看到,Click的触发是在系统捕捉到ACTION_UP后发生并由performClick()执行的,performClick里会调用先前注册的监听器的onClick()方法:
搞清楚这些问题对于编写出能正确响应UI操作的代码是很重要的,尤其当屏幕上的不同View需要针对此次UI操作做出各种不同响应的时候更是如此,一个典型例子就是用户在桌面上放置了一个Widget,那么当用户针对widget做各种操作时,桌面本身有的时候要对用户的操作做出响应,有时忽略。只有搞清楚事件触发和传递的机制才有可能保证在界面布局非常复杂的情况下,UI控件仍然能正确响应用户操作。
handled = mOnLongClickListener.onLongClick(View.this);
}
…
}
从实现中可以看到onClick()和onLongClick()方法是由ACTION_DOWN和ACTION_UP事件捕捉后根据各种情况最终确定是否触发的,也就是说如果我们在一个Activity或者View中同时监听或者覆写了onClick(),onLongClick()和onTouchEvent()方法,并不意味着只会发生其中一种。
onLongClick的发生是由单独的线程完成的,并且在ACTION_UP之前,而onClick的发生是在ACTION_UP后,因此同一次用户touch操作就有可能既发生onLongClick又发生onClick。这样是不是不可思议?所以及时向系统表示“我已经完全处理(消费)了用户的此次操作”,是很重要的事情。例如,我们如果在onLongClick()方法的最后return true,那么onClick事件就没有机会被触发了。
android详细解释键盘和鼠标事件

/jinhaijian/article/details/6013985目的:通过全面的分析Android的鼠标和键盘事件。
了解Android中如何接收和处理键盘和鼠标事件,以及如何用代码来产生事件。
主要学习内容:1. 接收并处理鼠标事件:按下、弹起、移动、双击、长按、滑动、滚动2. 接收并处理按键事件:按下、弹起3. 模拟鼠标/按键事件1. Android事件现代的用户界面,都是以事件来驱动的来实现人机交换的,而Android上的一套UI控件,无非就是派发鼠标和键盘事件,然后每个控件收到相应的事件之后,做相应的处理。
如Button 控件,就只需要处理Down、move、up这几个事件,Down的时候重绘控件,move的时候一般也需要重绘控件,当up的时候,重绘控件,然后产生onClick事件。
在Android中通过实现OnClickListener接口的onClick方法来实现对Button控件的处理。
对于触摸屏事件(鼠标事件)有按下有:按下、弹起、移动、双击、长按、滑动、滚动。
按下、弹起、移动(down、move、up)是简单的触摸屏事件,而双击、长按、滑动、滚动需要根据运动的轨迹来做识别的。
在Android中有专门的类去识别,android.view.GestureDetector。
对于按键(keyevent),无非就是按下、弹起、长按等。
2. Android事件处理Android手机的坐标系是以左上定点为原点坐标(0,0), 向右为X抽正方形,向下为Y抽正方向。
2.1 简单触摸屏事件在Android中任何一个控件和Activity都是间接或者直接继承于android.view.View。
一个View对象可以处理测距、布局、绘制、焦点变换、滚动条,以及触屏区域自己表现的按键和手势。
当我们重写View中的onTouchEvent(MotionEvent)方法后,就可以处理简单的触摸屏事件。
代码如下:view plaincopy to clipboardprint?1.public boolean onTouchEvent(MotionEvent event)2. {3. int events[] = {MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE,4. MotionEvent.ACTION_UP, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE,5. MotionEvent.ACTION_POINTER_DOWN,MotionEvent.ACTION_POINTER_UP,6. MotionEvent.EDGE_TOP,MotionEvent.EDGE_BOTTOM,MotionEvent.EDGE_LEFT,MotionEvent.EDGE_RIGHT};7.8. String szEvents[]={"ACTION_DOWN", "ACTION_MOVE",9. "ACTION_UP", "ACTION_MOVE", "ACTION_CANCEL", "ACTION_OUTSIDE",10. "ACTION_POINTER_DOWN","ACTION_POINTER_UP",11. "EDGE_TOP","EDGE_BOTTOM","EDGE_LEFT","EDGE_RIGHT"};12. for(int i=0; i < events.length; i++)13. {14. if(events[i] == event.getAction())15. {16. if(oldevent != event.getAction())17. {18. DisplayEventType(szEvents[i]);19. oldevent = event.getAction();20. }21. break;22. }23. }24. return super.onTouchEvent(event);25. }1.import android.view.GestureDetector;2.import android.view.GestureDetector.OnGestureListener;3.public class TestEvent extends Activity {4. /** Called when the activity is first created. */5.6. TextView m_eventType;7. int oldevent = -1;8. private GestureDetector gestureDetector= new GestureDetector(new OnGestureListener()9. {10.11. // 鼠标按下的时候,会产生onDown。
GestureDetector类及其用法

GestureDetector类及其用法当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。
虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。
GestureDetector这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener。
GestureDetector.OnDoubleTapListener接口:用来通知DoubleTap事件,类似于鼠标的双击事件。
1,onDoubleTap(MotionEvent e):在双击的第二下,Touch down时触发。
2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);双击的第二下Touch down和up都会触发,可用e.getAction()区分。
3,onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。
android ongesturelistener使用

android ongesturelistener使用android的OnGestureListener是一种Android事件监听器,可用于跟踪用户手势操作,如拇指滑动、双指拖动、屏幕单指轻击等。
使用OnGestureListener需要实现如下几个方法:* onDown(): 在手指接触屏幕时调用,返回true表示开始手势操作,return false则取消手势操作。
* onShowPress(): 在手指按下但没有移动或抬起的时候调用。
* onLongPress(): 在长按屏幕时调用。
* onScroll(): 在手指滑动的时候调用,第一个参数是滑动的起点,也就是手指按下的那个点,第二个参数是滑动的终点,也就是手指抬起的那个点,第三个参数是滑动的距离,也就是第二个参数减去第一个参数的值。
* onFling(): 在快速滑动的时候调用,第一个参数是滑动的起点,也就是手指按下的那个点,第二个参数是滑动的终点,也就是手指抬起的那个点,第三个参数是滑动的速度,也就是第四个参数减去第三个参数的值。
下面示例,我们使用OnGestureListener来处理拖动操作:1.实现GestureDetector.OnGestureListener接口并实现其中的几个方法:```class MyOnGestureListener implementsGestureDetector.OnGestureListener {@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在这里处理拖动操作return false;}@Overridepublic void onLongPress(MotionEvent e) {}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {return false;}}```2.创建GestureDetector实例并传入实现的MyOnGestureListener:```GestureDetector gestureDetector = new GestureDetector(this, new MyOnGestureListener());```3.在View 对象的onTouchEvent()方法中,调用GestureDetector的onTouchEvent()方法:```public boolean onTouchEvent(MotionEvent event) { gestureDetector.onTouchEvent(event);return super.onTouchEvent(event);}```以上就是如何使用OnGestureListener的基本步骤。
AndroidonTouchEvent事件中onTouch方法返回值(介绍)

AndroidonTouchEvent事件中onTouch⽅法返回值(介绍)1、若return false说明没有成功执⾏onTouch事件,在执⾏完onTouch⾥⾯的代码之后,onTouch事件并没有结束。
因此某些组件如Gallery会⾃动执⾏它所在view⾥onTouch⽅法的代码。
若在onTouch⽅法⾥⾯增加你的代码并且最后return false就会执⾏你在OnTouch⽅法中的处理操作了。
2、若return true说明你已经成功执⾏onTouch⽅法了,在执⾏完onTouch中的代码之后,这个onTouch事件就结束了。
也不会再调⽤组件如Gallery默认的onTouch⽅法了。
在onTouch⽅法中,我们可以做很多操作,如move,down,up等等,若我们在move⾥⾯return false,那么接着的fling,up等后⾯的事件也不会处理。
Gallery.setOnTouchListener(new OnTouchListener(){//@Overridepublic boolean onTouch(View v, MotionEvent event) {System.out.println("Gallery onTouch");if(event.getAction()==MotionEvent.ACTION_MOVE){mDismiss.removeMessages(1);System.out.println("ACTION_MOVE ");}else if(event.getAction()==MotionEvent.ACTION_UP){mDismiss.sendEmptyMessageDelayed(1,10000);System.out.println("ACTION_UP ");}return false;}});注意:1、在ViewGroup中onInterceptTouchEvent⽅法若反回false,那么触屏事件会继续向下传递,但如果没有⼦View去处理这个事件,即⼦view的onTouchEvent没有返回True,则最后还是由ViewGroup去处理这个事件,也就⼜执⾏了⾃⼰的onTouchEvent。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android OnTouchListener触屏事件接口
OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。
该接口中的监听方法签名如下。
Java代码:
public boolean onT ouch(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="/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(yout.main);
//设置当前的用户界面
Button bok=(Button)this.findViewById(R.id.Button01); //得到按钮的引用
bok.setOnT ouchListener(
//添加监听
new OnTouchListener(){
//创建监听类
public boolean onT ouch(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);
//让按钮随着触控笔的移动一起移动
youtParams lp= new youtParams( 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 onT ouchEvent (MotionEventevent){
//让按钮随触控笔的移动一起移动
Button bok=(Button)this.findViewById(R.id.Button01);
//得到按钮引用
youtParams lp=
new youtParams(
//创建
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回调方法,用来处理屏幕事件的监听方法,在方法中得到按钮的引用,然后设置按钮的坐标。
运行该案例,通过触控笔便可拖动屏幕中的按钮移动,如图所示。