"我们之所以成功,是因为站在巨人的肩膀上!"
概念: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);
}
...
...
}