事件机制【Android】
来源:互联网 发布:wsbs.js l tax.gov.cn 编辑:程序博客网 时间:2024/06/06 07:19
MotionEvent机制(触屏)
down手指按下int ACTION_DOWN=0
move:手指在屏幕上移动int ACTION_MOVE = 2
up手指在屏幕上离开int ACTION_UP=1
getAction():得到事件类型值
getX():得到事件发生的x轴坐标(相对于当前视图)
getRawX():得到事件发生的x轴坐标(相对于屏幕左顶点)
getY():得到事件发生的y轴坐标(相对于当前视图)
getRawY():得到事件发生的y轴坐标(相对于屏幕左顶点)
Activity
boolean dispatchTouchEvent(MotionEvent event):分发事件
boolean onTouchEvent(MotionEvent event):处理事件的回调
View
booleandispatchTouchEvent(MotionEventevent) : 分发事件
booleanonTouchEvent(MotionEventevent) : 处理事件的回调方法
voidsetOnTouchListener(OnTouchListenerl) : 设置事件监听器
voidsetOnClickListener(OnClickListenerl) : 设置点击监听
voidsetOnLongClickListener(OnLongClickListenerl) : 设置长按监听
void setOnCreateContextMenuListener(OnCreateContextMenuListenerl) : 用于创建菜单
ViewGroup
boolean dispatchTouchEvent(MotionEventev) : 分发事件
boolean onInterceptTouchEvent(MotionEventev) : 拦截事件的回调方法
分发------>>dispatchTouchEvent
处理------>>onInterceptTouchEvent,当前事件也就结束了
消费------>>处理事件的方法返回true
KeyEvent机制(按键)
int ACTION_DOWN = 0 : 标识down的常量
int ACTION_UP = 1 : 标识up的常量
int getAction() : 得到事件类型
int getKeyCode() : 得到按键的keycode(唯一标识)
startTracking() : 追踪事件, 用于长按监听
boolean dispatchKeyEvent(KeyEvent event) : 分发事件
boolean onKeyDown(int keyCode, KeyEvent event) : 按下按键的回调
boolean onKeyUp(int keyCode, KeyEvent event) : 松开按键的回调
boolean onKeyLongPress(int keyCode, KeyEvent event) : 长按按键的回调
用到的View相关方法
•int getLeft()得到当前视图左顶点相对父视图的X轴坐标•int getTop()得到当前视图左顶点相对父视图的Y轴坐标•intgetRight()得到当前视图右下角点相对父视图的X轴坐标•intgetBottom()得到当前视图右下角点相对父视图的Y轴坐标
•layout(intleft, inttop, intright, intbottom) : 动态指定当前视图在父视图中的定位, 参数为相对父视图的坐标•ViewParentgetParent():得到当前View的父视图对象
小案例------1 a.是图片移动,不能超出父类容器
private ImageView img_main;<pre name="code" class="java"> private int lastX; private int lastY; private RelativeLayout parentview; private int maxRight ; private int maxBottom;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img_main = (ImageView) findViewById(R.id.img_main);
<span style="white-space:pre"></span>parentview = (RelativeLayout) img_main.getParent();//得带img的父类Reaimg_main.setOnTouchListener(this); }
public boolean onTouch(View v, MotionEvent event) { <span style="white-space:pre"></span> int eventX = (int) event.getRawX();//记录当前的x坐标 <span style="white-space:pre"></span>int eventY = (int) event.getRawY();//记录当前的Y坐标 <span style="white-space:pre"></span>switch (event.getAction()) { <span style="white-space:pre"></span>case MotionEvent.ACTION_DOWN://如果是按下状态
<span style="white-space:pre"></span>if (maxRight == 0) { <span style="white-space:pre"></span>maxRight = parentview.getRight();//取得父容器的最右边,以及最下边 <span style="white-space:pre"></span>maxBottom = parentview.getBottom(); <span style="white-space:pre"></span>}
<span style="white-space: pre;"></span>lastX = eventX;
lastY = eventY; break; case MotionEvent.ACTION_MOVE: int dx = eventX-lastX; int dy = eventY-lastY; int left = img_main.getLeft()+dx; int top = img_main.getTop()+dy; int right = img_main.getRight()+dx; int bottom = img_main.getBottom()+dy; if (left<0) { right += -left; left = 0; } if (top<0) { bottom += -top; top = 0; } if (right > maxRight) { left -= right - maxRight; right = maxRight; } if (bottom > maxBottom) { top -= bottom-maxBottom; bottom = maxBottom; } img_main.layout(left,top,right,bottom); lastY=eventY; l- return true; }
案列二
每次我们使用手机上的软件是退出时,都会有提示,有的是在一定时间内要求点击两下退出,有的则是在点击返回按钮时,会出现一个是否要退出的对话框
现在做第一种情况,在2秒内点击两下返回键再退出
private boolean exit = false; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what==1) { exit = false;//点击一次后,发送一个2秒的延迟消息后,将exit改为false后,再次点击时会直接退出 } } }; @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (!exit) { exit = true; Toast.makeText(this,"再点一次在退出",Toast.LENGTH_SHORT).show(); handler.sendEmptyMessageDelayed(WHAT_DELAY,2000);//发送一个两秒的延迟空消息 return true;//返回true时并不退出 } } return super.onKeyUp(keyCode, event); }第二种情况:出现一个对话框public boolean onKeyUp(int keyCode, KeyEvent event) { if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) { new AlertDialog.Builder(this) .setMessage("你确定要退出吗?") .setPositiveButton("确定", new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNegativeButton("取消",null) .show(); return true; } return super.onKeyUp(keyCode, event);
- Android事件分发机制机制
- android 事件传递机制
- android 事件传递机制
- Android 广播事件机制
- Android事件触发机制
- android 事件流转机制
- Android 事件触发机制
- Android事件触发机制
- android事件传递机制
- Android事件处理机制
- android 事件机制
- android 事件处理机制
- android 事件机制
- Android事件传递机制
- Android 事件传递机制
- Android中的事件机制
- Android 事件传播机制
- Android事件传递机制
- Android OpenGL ES学习笔记之添加颜色
- 初识pipeline
- JS中数组API的原理及基本功能
- dataTable study
- Matlab接收串口数据
- 事件机制【Android】
- C++重载运算符“<<”,for your class/struct
- gulp-sass安装失败的原因可能是没有.net framework 2.0 SDK 和vs2015
- 条件变量和互斥锁
- CentOS下安装mysql
- leetcode No73. Set Matrix Zeroes
- 计算机网络基础
- JavaScript中的iterable
- Class版本号和Java版本对应关系