2013-09-25 58 views
0

我實現了一個程序來計算blackcanvas(canvas)上的座標,壓力,方向,手指大小等。但我需要在每個應用程序的頂部計算這些值。這是在PDF,網頁瀏覽器等之上,即它應該作爲後臺進程運行。它必須捕捉屏幕的每個觸摸實例。我應該將屏幕綁定到畫布上。如何計算Android屏幕上的觸摸座標?

公共類CaptureEventsActivity擴展活動實現OnTouchListener {

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

}

所以使用WindowManager.LayoutParams 當我打電話wm1.addView(BCAN,則params); 這是拋出一個錯誤

+0

有人plz幫助我.. – user2813658

回答

0

你應該讓你的活動實現OnTouchListener,而不是SensorEventListener。

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

順便說一句,你可能不希望盡一切onCreate(),創造一個像setView()與視圖相關的會比較好做事情的方法。它沒有壞處,只是一個好習慣。

希望這有助於(:

+0

在OnCreate中()我用下面windowsManager.LayoutParamas,當我打電話wm1.addView(BCAN,則params);它是拋出錯誤像 「添加Blackcanvas,但它已經有一個父」 – user2813658

+0

WindowManager.LayoutParams PARAMS =新WindowManager.LayoutParams( \t WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT, \t WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, \t窗口管理器。 LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPa rams.FLAG_WATCH_OUTSIDE_TOUCH, \t PixelFormat.TRANSLUCENT); \t \t params.gravity = Gravity.LEFT | Gravity.BOTTOM; \t \t WindowManager wm1 =(WindowManager)getSystemService(WINDOW_SERVICE); – user2813658

相關問題