基于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端。