我创建了一个用于在后台检测触摸事件的服务。我正在从主要活动中启动服务。问题是可以正确识别触摸,但是对于x和y位置,在使用其他应用程序(例如Google Maps)时,我总是得到0值。
如何对此进行更正,以便获得正确的x和y位置值?
GlobalTouchService.java的代码如下:
import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
public class GlobalTouchService extends Service implements OnTouchListener{
private String TAG = this.getClass().getSimpleName();
private WindowManager mWindowManager;
private LinearLayout touchLayout;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
touchLayout = new LinearLayout(this);
LayoutParams lp = new LayoutParams(1, LayoutParams.MATCH_PARENT);
touchLayout.setLayoutParams(lp);
touchLayout.setOnTouchListener(this);
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
1, /* width */
1, /* height */
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mWindowManager.addView(touchLayout, mParams);
}
@Override
public void onDestroy() {
if(mWindowManager != null) {
if(touchLayout != null) mWindowManager.removeView(touchLayout);
}
super.onDestroy();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG, "Action :" + event.getAction() + "\t X :" + event.getX() + "\t Y :"+ event.getY());
return false;
}
}
对于MainActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Intent globalService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
globalService = new Intent(this,GlobalTouchService.class);
}
public void buttonClicked(View v){
if(v.getTag() == null){
startService(globalService);
v.setTag("on");
((Button)v).setText("Stop Service");
Toast.makeText(this, "Start Service", Toast.LENGTH_SHORT).show();
}
else{
stopService(globalService);
v.setTag(null);
((Button)v).setText("Start Service");
Toast.makeText(this, "Stop Service", Toast.LENGTH_SHORT).show();
}
}
}