Android开发---MotionEvent(一)

来源:互联网 发布:tomcat数据库密码设置 编辑:程序博客网 时间:2024/06/05 13:24
"我们之所以成功,是因为站在巨人的肩膀上!"
概念:Object used to report movement (mouse, pen, finger, trackball) events.记录移动事件的对象
屏幕坐标系:

一.参数
MotionEvent.ACTION_DOWN手指按下
MotionEvent.ACTION_MOVE手指移动
MotionEvent.ACTION_UP手指离开屏幕

二.核心方法
(一)MotionEvent ev.getX();
1.当手指在屏幕上点击或滑动,打印会得到数值
12-14 18:32:52.903 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->569.0
12-14 18:32:52.923 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->569.0
12-14 18:32:52.943 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->569.0
12-14 18:32:52.973 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->569.0
12-14 18:32:52.993 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->569.0
12-14 18:32:54.573 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->872.0
12-14 18:32:54.593 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->872.0
12-14 18:32:54.603 7188-7188/com.spl.schoolui I/wxs﹕ ev.getX()---------------------------------->872.0

2.数值解释:
getX()
从屏幕左侧边缘 到 屏幕右侧边缘 , 数值从小到大增长.
例子: Sony L39t 大约是 0.0 ~ 1000.0


3.说明:
a.每次点击屏幕都会得到X轴绝对位置的值
b.如果手指在屏幕移动,那么会得到连续的值
c.没有负值

(二)MotionEvent ev.getY();
数值解释:
getY()
从屏幕上边缘 到 屏幕下边缘 , 数值从小到大增长.

三.实际应用案例
校园网UI的侧滑菜单触发位置和动作判断:
(一)计算公式
lastActionDownX = ev.getX();//最后一次x轴位置
int xOffset = (int) (ev.getX() - lastActionDownX);//当前的相对位置

(二)案例说明
public class ResideMenu extends FrameLayout {    ...    ...    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        float currentActivityScaleX = ViewHelper.getScaleX(viewActivity);        if (currentActivityScaleX == 1.0f)            setScaleDirectionByRawX(ev.getRawX());        switch (ev.getAction()) { //类似于v.getId()Return the kind of action being performed. 返回正在进行的动作类型            case MotionEvent.ACTION_DOWN:                lastActionDownX = ev.getX();//记录上一次的位置                lastActionDownY = ev.getY();                isInIgnoredView = isInIgnoredView(ev) && !isOpened();                pressedState = PRESSED_DOWN;                break;            case MotionEvent.ACTION_MOVE:                if (isInIgnoredView || isInDisableDirection(scaleDirection))                    break;                if (pressedState != PRESSED_DOWN                        && pressedState != PRESSED_MOVE_HORIZANTAL)                    break;                int xOffset = (int) (ev.getX() - lastActionDownX);//计算公式 !得到的数值:1.向右滑动正数 2.向左滑动负数                int yOffset = (int) (ev.getY() - lastActionDownY);                Log.i("wxs", "ev.getX()---------------------------------->" + ev.getX());                // Log.i("wxs","xOffset------------------------------------>"+xOffset);                // Log.i("wxs","yOffset------------------------------------>");                //设定什么情况下显示侧滑菜单                if (pressedState == PRESSED_DOWN) {                    if (yOffset > 25 || yOffset < -25) {                        pressedState = PRESSED_MOVE_VERTICAL;                        break;                    }                    //这里对何时触发侧滑菜单进行了判断 (原本是这样的 : xOffset < -50 || xOffset > 50 , 条件错误)                    //改为 : 只有点击了距离屏幕左侧小于200的位置(x轴上) , 并且向右滑动了大于50的距离时(x轴上) , 才触发侧滑菜单!                    //这时才会把按压状态设置为horizonta , 并且把motionevent设置为取消                    if (lastActionDownX < 200 && xOffset > 50) {                        pressedState = PRESSED_MOVE_HORIZANTAL;                        ev.setAction(MotionEvent.ACTION_CANCEL);                    }                } else if (pressedState == PRESSED_MOVE_HORIZANTAL) {                    if (currentActivityScaleX < 0.95)                        scrollViewMenu.setVisibility(VISIBLE);//显示侧滑菜单                    float targetScale = getTargetScale(ev.getRawX());                    ViewHelper.setScaleX(viewActivity, targetScale);                    ViewHelper.setScaleY(viewActivity, targetScale);                    ViewHelper.setScaleX(imageViewShadow, targetScale                            + shadowAdjustScaleX);                    ViewHelper.setScaleY(imageViewShadow, targetScale                            + shadowAdjustScaleY);                    ViewHelper.setAlpha(scrollViewMenu, (1 - targetScale) * 2.0f);                    lastRawX = ev.getRawX();                    return true;                }                break;            case MotionEvent.ACTION_UP:                if (isInIgnoredView)                    break;                if (pressedState != PRESSED_MOVE_HORIZANTAL)                    break;                pressedState = PRESSED_DONE;                if (isOpened()) {                    if (currentActivityScaleX > 0.56f)                        closeMenu();                    else                        openMenu(scaleDirection);                } else {                    if (currentActivityScaleX < 0.94f) {                        openMenu(scaleDirection);                    } else {                        closeMenu();                    }                }                break;        }        lastRawX = ev.getRawX();        return super.dispatchTouchEvent(ev);    }    ...    ...}

2 0
原创粉丝点击