Android layout 如何在android屏幕上计算触摸坐标?

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

我在blackcanvas(canvas)上实现了计算坐标、压力、方向、手指大小等的程序。但我需要在每个应用程序上计算这些。它位于PDF、web浏览器等之上,即它应作为后台进程运行。它必须捕获屏幕上的每一个触摸实例。我应该把屏幕和画布绑在一起

公共类CaptureEventsActivity将活动实现扩展到TouchListener{

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 } }