Accumu 原创,转载请注明出处
刚拿到这个任务的时候还是有点手足无措的,首先想到的是这个点击事件从哪里来,怎么传递过来的,记得之前看到的一本书是深入理解android卷一中有写到 底层的事件是从哪里来的
通过 adb shell getevent -t命令我们可以看到 一系列的输入事件
[ 10088.480024] /dev/input/event0 :0000 0000 00000000
产生的事件如下
- [ 10088.480024] 为产生事件的时间戳
- /dev/input/event0 为产生事件的设备节点
- 0000 事件类型
- 0000 事件代码
- 00000000 事件的值
得到这些底层事件后 我们并不知道该怎么处理,在哪处理这些都是驱动层和native层处理的,
我们需要知道这些事件通过传递打包,封装,处理,最后在java世界的哪里可以看到与native层的联系呢?一片迷茫
度娘了一下:(推荐google和stackvoerflow,英文水平差,用度娘实属无奈之举)
android获取鼠标坐标发现了在activity中可以通过设置一个touch监听来获得坐标贴出代码:
linearLayout = (LinearLayout)super.findViewById(R.id.LinearLayout1);
linearLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
System.out.println("---action down-----");
show.setText("起始位置为:"+"("+event.getX()+" , "+event.getY()+")");
break;
case MotionEvent.ACTION_MOVE:
System.out.println("---action move-----");
show.setText("移动中坐标为:"+"("+event.getX()+" , "+event.getY()+")");
break;
case MotionEvent.ACTION_UP:
System.out.println("---action up-----");
show.setText("最后位置为:"+"("+event.getX()+" , "+event.getY()+")");
}
return true;
}
});
可以发现 这里通过对lineraLayout(根布局的lineraLayout)设置OnTouchListener监听来获取触摸事件,我们可以发现这个监听实现了一个onTouch方法,这个方法传递过来两个参数,第一个参数是view肯定是当前触摸的view 第二个参数是MotionEvent event 先不用管我们继续往下看,有一个switch语句 可以清楚的看到选择语句有三个,即对应不同的字段,
MotionEvent.ACTION_DOWN
开始按下手指 动作包含初始起始位置
MotionEvent.ACTION_MOVE
这个改变在手势中发生了变化呢(在ACTION_DOWN和ACTION_UP之间)
MotionEvent.ACTION_UP
运动包含最后的释放位置以及自上次向下或移动事件以来的任何中间点
这三个字段基本上包含了所有的鼠标点击 点击滑动 松开鼠标的全部过程
而如果要获得鼠标点击的坐标 移动过程中的坐标,以及移动后松开的坐标 可以通过
event.getX 和event.getY来获得
现在我们已经基本上清楚了从一个activity中获得鼠标的坐标位置的方法,既然是从motionEvent这个类中的对象调用getX和getY方法来获得,那我们如何在没有启动一个应用程序的时候获取到鼠标的坐标呢?
我们先从MotionEvent这个类开始看
在这个类中有一个返回float类型的 final方法
public final float getX() {
return nativeGetAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT);
}
这个方法返回一个native方法 这个native方法我们先暂时不用管,既然是返回的native方法那么我们就知道现在已经到了底层的调用了,这就不是framework的工作了,那么现在又有一个疑惑,在framework层是怎么调用这个MotionEvent方法的呢?这就涉及到android触摸事件机制了
当一个touch事件到达根节点,即activity的viewgroup时,他会依次下发,下发的过程是调用dispatchtouchevent方法实现的。那么究竟这个dispatchTouchEvent这个方法在哪个类中呢?
每一个view都是继承自View 这个根类的,那么我们就可以知道肯定是view类中的dispatchTouchEvent开始下发的
我们看view类中的方法
dispatchTouchEvent方法的描述
pass the touch screen motion event down to the target view,or this view if it is the target.
那么我们现在就可以从从这个地方发送一条广播
发送广播 首先要两个类 那么我们就import这两个类
import android.content.Intent
import android.content.ContextWrapper
//创建ContextWrapper对象
private ContextWrapper mContextWrapper = new ContextWrapper(mContext);
//创建Intent对象
Intent intent = new Intent("com.example.broadcast.ontouch_event");
//获得坐标的X值
intent.putExtra("eventX",event.getX());
//获得坐标的Y值
intent.putExtra("eventY",event.getY());
//将这个广播发送出去
mContextWrapper.sendBroadCast(intent);