Android模拟点击,让Button自己戳自己

文章类别 in java

先看看效果,就是不用我手动去点Button,让系统自己去点它,有一种自虐的感觉:

怎么实现?

首先在xml定义一个Button和一个TextView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:gravity="center"
tools:context="com.wistbean.clickman.MainActivity">

<Button
android:id="@+id/bt_clickme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/clickme"
android:gravity="center"
/>

<TextView
android:id="@+id/tv_describe"
android:layout_marginTop="35dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="48sp"
android:layout_below="@id/bt_clickme"
/>
</RelativeLayout>

很简单,就是一个Button和一个TextView,Button用于被点击,TextView我们用来显示按钮被点击的次数。

接下来就在MainActivity中:

先初始化View并监听点击事件:

 private void initView() {
clickView = (Button) findViewById(R.id.bt_clickme);
clickView.getLocationOnScreen(localtions);
tv = (TextView) findViewById(R.id.tv_describe);

clickView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
  i++;
tv.setText("啊~ 疼 +" + i);
}
});
}

通过clickView.getLocationOnScreen(location)来获取当前这个View的位置,传入的参数是一个数组,其中location[0]代表X,location[1]代表Y,然后监听点击事件,当被点击后i就加1,并让TextView显示出来。

因为这是耗时操作,所以我们开个线程:

    private void startAutoClick() {

   new Thread(){

   @Override
   public void run() {
   super.run();
    while(i<87)
    {
    try {
    sleep(500);
    handler.sendEmptyMessage(1);
    
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

   }
   }.start();
}




` 可以看到,我们这里是每隔500毫秒执行一次,直到点击了88次才停止让它点击。

接下来我们在handler调用自动模拟点击方法:

private Handler handler = new Handler(){

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1)
{
motionStart(clickView,localtions[0],localtions[1]);
}


}
};

我们的motionStart是核心功能:

  private void motionStart(View clickView, int x, int y) {

long downTime = SystemClock.uptimeMillis();
MotionEvent downEvent = MotionEvent.obtain(downTime,downTime,MotionEvent.ACTION_DOWN,x,y,0);
downTime += 1000;
MotionEvent upEvent = MotionEvent.obtain(downTime, downTime,
MotionEvent.ACTION_UP, x, y, 0);
clickView.onTouchEvent(downEvent);
clickView.onTouchEvent(upEvent);
downEvent.recycle();
upEvent.recycle();
}

可以看到我们主要是用了MotionEvent,MotionEvent可以得到具体位置的操作事件,然后通过View的onTouchEvent方法传入,就可以实现View的自动操作啦!