事件机制【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机制(按键)

•KeyEvent 

int ACTION_DOWN = 0  : 标识down的常量

int ACTION_UP = 1 : 标识up的常量

int getAction() : 得到事件类型

int getKeyCode() : 得到按键的keycode(唯一标识)

 startTracking() : 追踪事件, 用于长按监听

•Activity

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的父类Rea
img_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);
                                             
0 0