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

时间:2023-03-09 06:53:02
基于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>

运行后的效果:

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

中间的空白区即是用户操作鼠标的区域,为了识别用户的动作,定义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端。