基于TCP和多线程实现无线鼠标键盘-GestureDetector

为了实现无线鼠标,需要识别出用户在手机屏幕上的滑动动作,这就需要用到GestureDetector类。

首先是activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginRight="20dp"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_options"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="设置" />

        <Button
            android:id="@+id/btn_connect"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="连接" />

    </LinearLayout>

    <TextView
        android:id="@+id/txt_mouse"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="5dp"
        android:text="鼠标灵敏度:" />

    <SeekBar
        android:id="@+id/skb_mouse"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:max="400"
        android:progress="100" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_left"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="左键" />

        <Button
            android:id="@+id/btn_right"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="右键" />

    </LinearLayout>

    <TextView
        android:id="@+id/txt_touch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <Button
        android:id="@+id/btn_keyboard"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical|center_horizontal"
        android:text="键盘" />

</LinearLayout>

运行后的效果:

中间的空白区即是用户操作鼠标的区域,为了识别用户的动作,定义Mouse_GestureListener类,该类继承自GestureDetector.SimpleOnGestureListener:

class Mouse_GestureListener extends GestureDetector.SimpleOnGestureListener{
	
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
	
		MainActivity.dis_x = e2.getX()-e1.getX();
		MainActivity.dis_y = e2.getY()-e1.getY();
		// 移动距离是否足够
		if ((float)Math.pow((Math.pow(MainActivity.dis_x,2)+Math.pow(MainActivity.dis_y,2)),0.5)
              >MainActivity.dis_t){ MainActivity.dis_x *= MainActivity.move_times; MainActivity.dis_y *= MainActivity.move_times; MainActivity.send_thread.set_str(MainActivity.df2.format(MainActivity.dis_x)+
                  "/"+MainActivity.df2.format(MainActivity.dis_y)); } return true; }

onFling(MotionEvent e1, MotionEvent e2, float velocityX,  float velocityY)即手指在屏幕上滑动时的事件,e1是第一个点,e2是第二个点,计算这两个点的x坐标和y坐标之差,就是这次滑动在x轴和y轴上移动的距离,并且将计算出来的距离乘以鼠标灵敏度,交给发送线程发送给Windows端。

在MainActivity类中定义:

GestureDetector gd;

在onCreate(Bundle savedInstanceState)方法中加上一句:

gd = new GestureDetector(this, new Mouse_GestureListener());

还要在MainActivity类中定义方法

	 public boolean onTouchEvent(MotionEvent event) { 
		 
		  if (gd.onTouchEvent(event)) 
			  return true; 
		  else
			  return false; 
		  
	 }

这样,就可以识别出用户在手机屏幕上操作鼠标的动作,并且发送给Windows端。

posted @ 2013-11-30 17:28  MSTK  阅读(568)  评论(0编辑  收藏  举报