Android layout 如何在android屏幕上计算触摸坐标?
我在blackcanvas(canvas)上实现了计算坐标、压力、方向、手指大小等的程序。但我需要在每个应用程序上计算这些。它位于PDF、web浏览器等之上,即它应作为后台进程运行。它必须捕获屏幕上的每一个触摸实例。我应该把屏幕和画布绑在一起 公共类CaptureEventsActivity将活动实现扩展到TouchListener{Android layout 如何在android屏幕上计算触摸坐标?,android-layout,android-intent,android-fragments,Android Layout,Android Intent,Android Fragments,我在blackcanvas(canvas)上实现了计算坐标、压力、方向、手指大小等的程序。但我需要在每个应用程序上计算这些。它位于PDF、web浏览器等之上,即它应作为后台进程运行。它必须捕获屏幕上的每一个触摸实例。我应该把屏幕和画布绑在一起 公共类CaptureEventsActivity将活动实现扩展到TouchListener{ String root = android.os.Environment.getExternalStorageDirectory().toString(); Fi
String root = android.os.Environment.getExternalStorageDirectory().toString();
File mydir = new File(root + "/saved_texts");
File file1 = new File(mydir,"Research.xls");
FileOutputStream out_stream;
FileOutputStream out_stream1;
Float azimut;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
WindowManager wm1 = (WindowManager) getSystemService(WINDOW_SERVICE);
BlankCanvas bcan = new BlankCanvas(this,null);
this.setContentView(bcan);
bcan.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("NewApi")
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
BlankCanvas bcn = (BlankCanvas) arg0;
int pointerIndex = event.getActionIndex();
int pointerId = event.getPointerId(pointerIndex);
int maskedAction = event.getActionMasked();
switch(maskedAction) {
case MotionEvent.ACTION_DOWN:
{
//EventData eventData = new EventData();
handler.postDelayed(CaptureEventsActivity.this.mLongPressed, 1000);
GesturePoint gp = new GesturePoint(event.getX(),event.getY(),System.currentTimeMillis());
aa.add(gp);
//bcn.path.moveTo(event.getX(), event.getY());
touchDirection = getTouchDirection(event.getX(), event.getY());
String strD = String.valueOf((int)event.getX()) +'\t'+ String.valueOf((int)event.getY()) +'\t'+ String.valueOf(event.getOrientation())+'\t' +event.getPressure()+'\t'+event.getEventTime()+'\t'+"ACTION_DOWN"+'\t'+event.getSize()+'\t'+ touchDirection+'\t'+'\n';
try {
out_stream.write(strD.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;}
case MotionEvent.ACTION_MOVE:
{
if(event.getPointerCount()>1)
{
for (int size = event.getPointerCount(), i = 0; i < size; i++) {
PointF point = mActivePointers.get(event.getPointerId(i));
if (point != null) {
//bcn.path.lineTo(event.getX(i), event.getY(i));
String x="";
//if(i==1)
x="finger:"+i;
//touchDirection = getTouchDirection(event.getX(i), event.getY(i));
String strM = String.valueOf((int)event.getX(i)) +'\t'+ String.valueOf((int)event.getY(i)) +'\t'+ String.valueOf(event.getOrientation(i))+'\t' +event.getPressure(i)+'\t'+event.getEventTime()+'\t'+"ACTION_MOVE"+'\t'+event.getSize(i)+'\t'+ touchDirection+'\t'+x+'\n';
try {
out_stream.write(strM.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
else
{
handler.removeCallbacks(CaptureEventsActivity.this.mLongPressed);
//bcn.path.lineTo(event.getX(), event.getY());
//touchDirection = getTouchDirection(event.getX(i), event.getY(i));
String strM = String.valueOf((int)event.getX()) +'\t'+ String.valueOf((int)event.getY()) +'\t'+ String.valueOf(event.getOrientation())+'\t' +event.getPressure()+'\t'+event.getEventTime()+'\t'+"ACTION_MOVE"+'\t'+event.getSize()+'\t'+ touchDirection+'\t'+'\n';
try {
out_stream.write(strM.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
case MotionEvent.ACTION_POINTER_DOWN:
{
PointF f = new PointF();
handler.postDelayed(CaptureEventsActivity.this.mLongPressed, 1000);
GesturePoint gp = new GesturePoint(event.getX(),event.getY(),System.currentTimeMillis());
aa.add(gp);
f.x = event.getX(pointerIndex);
f.y = event.getY(pointerIndex);
// bcn.path.moveTo(event.getX(), event.getY());
touchDirection = getTouchDirection(event.getX(), event.getY());
String strA = String.valueOf((int)f.x) +'\t'+ String.valueOf((int)f.y) +'\t'+ String.valueOf(event.getOrientation())+'\t' +event.getPressure()+'\t'+event.getEventTime()+'\t'+"ACTION_POINTER_DOWN"+'\t'+event.getSize()+'\t'+ touchDirection+'\t'+'\n';
mActivePointers.put(pointerId, f);
try {
out_stream.write(strA.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
case MotionEvent.ACTION_POINTER_UP:
{
PointF f = new PointF();
handler.postDelayed(CaptureEventsActivity.this.mLongPressed, 1000);
GesturePoint gp = new GesturePoint(event.getX(),event.getY(),System.currentTimeMillis());
aa.add(gp);
f.x = event.getX(pointerIndex);
f.y = event.getY(pointerIndex);
mActivePointers.put(pointerId, f);
// bcn.path.moveTo(event.getX(), event.getY());
touchDirection = getTouchDirection(event.getX(), event.getY());
String strU = String.valueOf((int)event.getX()) +'\t'+ String.valueOf((int)event.getY()) +'\t'+ String.valueOf(event.getOrientation())+'\t' +event.getPressure()+'\t'+event.getEventTime()+'\t'+"ACTION_POINTER_UP"+'\t'+event.getSize()+'\t'+ touchDirection+'\t'+'\n';
try {
out_stream.write(strU.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
case MotionEvent.ACTION_UP:
{ handler.removeCallbacks(CaptureEventsActivity.this.mLongPressed);
GesturePoint gp = new GesturePoint(event.getX(),event.getY(),System.currentTimeMillis());
aa.add(gp);
GesturePoint gp1= new GesturePoint(event.getOrientation(),event.getPressure(),event.getAction());
aa.add(gp1);
//GestureStroke gs = new GestureStroke(aa);
touchDirection = getTouchDirection(event.getX(), event.getY());
String strU = String.valueOf((int)event.getX()) +'\t'+ String.valueOf((int)event.getY()) +'\t'+ String.valueOf(event.getOrientation())+'\t' +event.getPressure()+'\t'+event.getEventTime()+'\t'+"ACTION_UP"+'\t'+event.getSize()+'\t'+ touchDirection+'\t'+'\n';
try {
out_stream.write(strU.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
aa.clear();
}
break;
default:
/*String x =String.valueOf(bcn.getX())+'\n';
try {
out_stream.write(x.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
return false;
}
bcn.invalidate();
return true;
}
});
//}
//wm1.addView(bcan, params);
bcan.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
Log.e("CaptureEvent", "in long preess...");
long_clicks++;
return true;
}
});
}
//@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
try {
//String w_s = "No.of strikes..." + String.valueOf(no_of_strikes) + '\n';
//out_stream.write(w_s.getBytes());
//w_s = "No.of Long Clicks..."+String.valueOf(long_clicks) + '\n';
//out_stream.write(w_s.getBytes());
out_stream.flush();
out_stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String getTouchDirection (float eventX, float eventY) {
String direction = "";
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics( metrics );
float centreX = 800; /// metrics.widthPixels * eventX;
float centreY = 480; /// metrics.heightPixels * eventY;
// float centreX = 400/2, centreY = 700/2;
float tx = (float) (eventX - centreX), ty = (float) (eventY - centreY);
float radius = (float) Math.sqrt(tx*tx + ty*ty);
float offsetX = 0, offsetY = radius, adjEventX = eventX - centreX, adjEventY = centreY - eventY;
double cosaU = ((offsetX * adjEventX) + (offsetY * adjEventY));
double cosaD = ( Math.sqrt((offsetX * offsetX) + (offsetY * offsetY)) * Math.sqrt((adjEventX * adjEventX) + (adjEventY * adjEventY)));
double cosa = cosaU / cosaD;
double degr = ( Math.acos(cosa) * (180 / Math.PI));
if (adjEventX < 0)
degr = 360 - degr;
float offsetDegrees = (float) (degrees + degr);
if (offsetDegrees > 360)
offsetDegrees = offsetDegrees - 360;
if (offsetDegrees < 22.5 || offsetDegrees > 336.5)
direction = "NORTH";
else if (offsetDegrees > 22.5 && offsetDegrees < 67.5)
direction = "NORTHEAST";
else if (offsetDegrees > 67.5 && offsetDegrees < 112.5)
direction = "EAST";
else if (offsetDegrees > 112.5 && offsetDegrees < 156.5)
direction = "SOUTHEAST";
else if (offsetDegrees > 156.5 && offsetDegrees < 201.5)
direction = "SOUTH";
else if (offsetDegrees > 201.5 && offsetDegrees < 246.5)
direction = "SOUTHWEST";
else if (offsetDegrees > 246.5 && offsetDegrees < 291.5)
direction = "WEST";
else if (offsetDegrees > 291.5 && offsetDegrees < 336.5)
direction = "NORTHWEST";
return direction;
}
String root=android.os.Environment.getExternalStorageDirectory().toString();
File mydir=新文件(root+“/保存的_文本”);
File file1=新文件(mydir,“Research.xls”);
FileOutputStream输出流;
FileOutputStream out_stream1;
浮动方位角;
@凌驾
创建时的公共void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
WindowManager.LayoutParams params=新建WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_父级,WindowManager.LayoutParams.MATCH_父级,
WindowManager.LayoutParams.TYPE\系统\警报,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_outh_TOUCH|,
像素格式(半透明);
params.gravity=gravity.LEFT | gravity.BOTTOM;
WindowManager wm1=(WindowManager)getSystemService(窗口服务);
BlankCanvas bcan=新的BlankCanvas(此为空);
这个.setContentView(bcan);
bcan.setOnTouchListener(新视图.OnTouchListener(){
@SuppressLint(“新API”)
@凌驾
公共布尔onTouch(视图arg0,运动事件){
//TODO自动生成的方法存根
BlankCanvas bcn=(BlankCanvas)arg0;
int pointerIndex=event.getActionIndex();
int pointerId=event.getPointerId(pointerIndex);
int maskedAction=event.getActionMasked();
开关(掩蔽){
case MotionEvent.ACTION\u DOWN:
{
//EventData EventData=新的EventData();
handler.postDelayed(CaptureEventsActivity.this.mLongPressed,1000);
GesturePoint gp=new GesturePoint(event.getX()、event.getY()、System.currentTimeMillis());
aa.添加(gp);
//bcn.path.moveTo(event.getX(),event.getY());
touchDirection=getTouchDirection(event.getX(),event.getY());
String strD=String.valueOf((int)event.getX())+'\t'+String.valueOf((int)event.getY())+'\t'+String.valueOf(event.getOrientation())+'\t'+event.getPressure()+'\t'+event.getEventTime()+'\t'+“动作”+'\t'+event.getSize()+'\t'+touchtdirection+'\t'\n';
试一试{
out_stream.write(strD.getBytes());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
中断;}
case MotionEvent.ACTION\u移动:
{
if(event.getPointerCount()>1)
{
对于(int size=event.getPointerCount(),i=0;ipublic class CaptureEventsActivity extends Activity implements OnTouchListener {
...
// Set the listener as itself
setOnTouchListener(CaptureEventsActivity.this);
...
@Override
public boolean onTouch(View v, MotionEvent event) {
// Do things here
}
}