Android项目---TouchListener
2014-05-04 20:10
141 查看
publicstaticinterface
用到这个类,一般就是在Android项目中,获取手点击屏幕的焦点。
如果实在控件上操作的话,一般将TouchListener事件单独提出来,写成一个工具类。
一、定义TouchListener工具类
注:一定要给每个case写break。。。
ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEventevent)中
使用switch(event.getAction())可以处理ACTION_DOWN和ACTION_UP事件
使用switch(event.getAction()&MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
TouchListener中有一个问题,在重写onTouch方法的时候,返回值false和true的不同。
如果是false,则出了按钮控件会正常显示down,up,move的值,其他控件都只能显示down的事件
如果是true,则就会不断的取值。
event.getX();//指的是控件的x坐标
event.getRawX();//指的是屏幕的X坐标
二、接收广播
三、注册广播
关于onTouch事件的算法思想:
获取动作多点触控
如果是按下
得到按下时控件的Y轴值
如果是抬起
获取手指抬起时获得的屏幕新的X的值
如果手指按下的位置靠近屏幕左边100像素内,并且新位置的值减去旧位置的值大于200(从左向右滑动)
打开菜单栏(向Activity中发送打开广播)
如果新位置值减去旧位置值小于200(从右向左滑动)或者<新旧位置值差值大于0并且新减旧小于200(从左向右滑动距离太短)并且是在距离屏幕100像素内>
关闭菜单栏(向Activity中发送关闭广播)
如果现在菜单是打开着的并且是从右向左滑动且滑动距离很短(小于200)则将菜单重新弹出
打开菜单栏
否则如果控件Y轴的变化大于50就认为他是要上下滑动listview不去执行左右开关操作
如果手势是弧形且弧形平缓就理解为是左右滑动
打开菜单
如果手势是弧形且弧形陡峭就理解为是上下滑动不在执行打开关闭菜单操作认为用户是在滑动listview
关闭菜单
如果是移动
获取屏幕的x值
获取移动的距离
发送广播
View.OnTouchListener
android.view.View.OnTouchListener |
KnownIndirectSubclasses |
ClassOverview
Interfacedefinitionforacallbacktobeinvokedwhenatoucheventisdispatchedtothisview.Thecallbackwillbeinvokedbeforethetoucheventisgiventotheview.Summary
PublicMethods | |
---|---|
abstractboolean | Calledwhenatoucheventisdispatchedtoaview. |
如果实在控件上操作的话,一般将TouchListener事件单独提出来,写成一个工具类。
一、定义TouchListener工具类
publicclassTouchListenerimplementsOnTouchListener{
Contextcontext;
floatoldDist;
floatnewDist;
floatoldY;
floatnewY;
List<Float>list=newArrayList<Float>();
booleanon_off;
publicTouchListener(Contextcontext){
this.context=context;
}
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
floatf2=event.getRawX();
list.add(f2);
oldDist=list.get(0);//存集合里又因为onTouch方法会不断会掉这个值会不断加入集合中
switch(event.getAction()&MotionEvent.ACTION_MASK){
caseMotionEvent.ACTION_DOWN:
System.out.println("DOWN");
oldY=event.getY();
break;
caseMotionEvent.ACTION_UP:
System.out.println("UP");
newDist=event.getRawX();
if(oldDist<100&&newDist-oldDist>200){
Intentintent=newIntent();
intent.setAction("open");
context.sendBroadcast(intent);
HomeActivity.isopen=true;
}
if(newDist-oldDist<-200
||(newDist-oldDist>0&&newDist-oldDist<200&&oldDist<100)){
Intentintent=newIntent();
intent.setAction("back");
context.sendBroadcast(intent);
}
if(newDist-oldDist<0&&newDist-oldDist>-200
&&HomeActivity.isopen){
Intentintent=newIntent();
intent.setAction("open");
context.sendBroadcast(intent);
HomeActivity.isopen=true;
}else{
list=newArrayList<Float>();
newY=event.getY();
if(Math.abs(newY-oldY)<40
&&Math.abs(newDist-oldDist)>40){returntrue;
}else{returnfalse;
}
}
break;
caseMotionEvent.ACTION_MOVE:
System.out.println("MOVE");
newDist=event.getRawX();
floatdistance=newDist-oldDist;
Intentintent=newIntent();
intent.putExtra("distance",distance);
intent.putExtra("old",oldDist);
intent.setAction("move");
context.sendBroadcast(intent);
Log.i("info","MOVE");
break;
}
returntrue;
}
}
注:一定要给每个case写break。。。
ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEventevent)中
使用switch(event.getAction())可以处理ACTION_DOWN和ACTION_UP事件
使用switch(event.getAction()&MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作; ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多点触摸屏幕,当有一只手指按下去的时候,另一只手指按下和放开的动作捕捉; ACTION_MOVE就是手指在屏幕上移动的操作;
TouchListener中有一个问题,在重写onTouch方法的时候,返回值false和true的不同。
如果是false,则出了按钮控件会正常显示down,up,move的值,其他控件都只能显示down的事件
如果是true,则就会不断的取值。
event.getX();//指的是控件的x坐标
event.getRawX();//指的是屏幕的X坐标
二、接收广播
BroadcastReceiverreceiver=newBroadcastReceiver(){
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals("open")){
newAsyncMove2().execute();
}
if(intent.getAction().equals("back")){
isopen=false;
newAsyncMove2().execute();
}
if(intent.getAction().equals("move")){
floatf=intent.getFloatExtra("distance",0);
floatold=intent.getFloatExtra("old",0);
LinearLayout.LayoutParamslp=(LayoutParams)left_menu
.getLayoutParams();
if(isopen&&f<0){
lp.leftMargin=(int)f;
}elseif(!isopen&&f>0&&old<100){
lp.leftMargin=(int)(-left_menu.getWidth()+f);
}
left_menu.setLayoutParams(lp);
}
}
};
三、注册广播
IntentFilterinf=newIntentFilter();
inf.addAction("open");
inf.addAction("back");
inf.addAction("move");
registerReceiver(receiver,inf);
关于onTouch事件的算法思想:
获取动作多点触控
如果是按下
得到按下时控件的Y轴值
如果是抬起
获取手指抬起时获得的屏幕新的X的值
如果手指按下的位置靠近屏幕左边100像素内,并且新位置的值减去旧位置的值大于200(从左向右滑动)
打开菜单栏(向Activity中发送打开广播)
如果新位置值减去旧位置值小于200(从右向左滑动)或者<新旧位置值差值大于0并且新减旧小于200(从左向右滑动距离太短)并且是在距离屏幕100像素内>
关闭菜单栏(向Activity中发送关闭广播)
如果现在菜单是打开着的并且是从右向左滑动且滑动距离很短(小于200)则将菜单重新弹出
打开菜单栏
否则如果控件Y轴的变化大于50就认为他是要上下滑动listview不去执行左右开关操作
如果手势是弧形且弧形平缓就理解为是左右滑动
打开菜单
如果手势是弧形且弧形陡峭就理解为是上下滑动不在执行打开关闭菜单操作认为用户是在滑动listview
关闭菜单
如果是移动
获取屏幕的x值
获取移动的距离
发送广播
相关文章推荐
- android 页面滑动 ViewFlipper,OnGestureListener,OnTouchListener
- Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义
- android之OnTouchListener只能监听到ACTION_DOWN-----onTouchListener的返回值问题
- Android基础入门教程——3.4 TouchListener PK OnTouchEvent + 多点触碰
- (OnTouchListener) android中的触摸事件的使用(绘图)
- Android 之 TouchListener 示例
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()和setOnTouchListener()
- android人脸识别项目FaceDetectionListener--------研究之三
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
- Android 百度地图开发-setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
- Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决
- Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决
- Android----------ontouchlistener触摸事件
- Android学习记录:MotionEvent,onTouch,OnTouchListener 事件机制等学习
- Android:完美解决listview的setonitemclicklistener 和 setontouchlistener冲突问题
- 浅析Android的setOnTouchListener的返回值是false和true的区别
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
- Android View.OnTouchListener 的子类,AutoScrollHelper,ZoomButtonsController,ListViewAutoScrollHelper
- Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决