Android开发---MotionEvent(一)

"我们之所以成功,是因为站在巨人的肩膀上!"
概念: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值