2010-12-27 13 views
1

In einem meiner Projekte möchte ich etwas wie eine Klick-Heatmap sammeln. Gibt es eine Möglichkeit, dies in Android zu tun?Android - Hijack Klicks

Ich habe darüber nachgedacht, ein transparentes Layout über das ursprüngliche Layout hinzuzufügen und "Hijack" klickt dort und dann an das zugrunde liegende Layout übergeben. Aber ich kann es nicht herausfinden.

Also, irgendwelche Ideen, wie man das macht?

+0

Versuchen Sie, dies für alle Aktivitäten zu tun? Oder nur deine Aktivität? Dies wird für andere Aktivitäten aus offensichtlichen Sicherheitsgründen nicht funktionieren. – Falmarri

+1

Hallo zusammen, ich habe die Lösung selbst gefunden. Sie finden sie in der onInceptTouchEvent-Funktion. Sie können sie überschreiben, um alle Berührungsereignisse abzufangen, bevor sie an die untergeordneten Ansichten übergeben werden. Also habe ich ein Layout erstellt, das FrameLayout erweitert. Umgeben mein Layout mit diesem Layout und das ist es :) – Goddchen

+1

Wenn Sie eine Antwort haben, sollten Sie es als Antwort, anstatt einen Kommentar posten. –

Antwort

1

ich fand nur die Lösung selbst. Es liegt in der onInterceptTouchEvent() Funktion. Sie können sie überschreiben, um alle Berührungsereignisse abzufangen, bevor sie an die untergeordneten Ansichten übergeben werden. Also habe ich ein Layout erstellt, das FrameLayout erweitert. Umgeben mein Layout mit diesem Layout und das ist es :)

0

Möchten Sie nur erfassen, wie oft eine bestimmte Ansicht angeklickt wird? Oder wollen Sie die genauen Pixelkoordinaten der Berührung? Wenn Sie Ersteres sind, können Sie einfach den onTouchListener für jeden von ihnen überschreiben und einen Zähler für diese Ansicht erhöhen.

Für letztere, ich spielte ein bisschen mit einem onTouchListener, und war in der Lage, es zum Laufen zu bringen, aber Sie müssen wahrscheinlich einen onTouchListener zu jeder Ansicht setzen, was keine große Sache sein sollte, aber nur etwas zu beachten, es sei denn jemand hat einen besseren Weg.

Vector2D.java

public class Vector2D { 
    private float x; 
    private float y; 

    public Vector2D(float x, float y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void setX(float x) { 
     this.x = x; 
    } 

    public float getX() { 
     return this.x; 
    } 

    public void setY(float y) { 
     this.y = y; 
    } 

    public float getY() { 
     return this.y; 
    } 
} 

Main.java

public class Main extends Activity implements OnTouchListener { 
    /** Called when the activity is first created. 
    * @return */ 

    //defined as class variable so it's accessible from onTouch() 
    List<Vector2D> points; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     //adds a new coordinate to the list, 
     //with the X and Y values of the touch 
     points.add(new Vector2D(event.getX(), event.getY())); 
     Log.d("TOUCH", "X:" + event.getX() + " Y:" + event.getY()); 
     return true; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test);  

     points = new ArrayList<Vector2D>();  
     final LinearLayout ll = (LinearLayout)findViewById(R.id.linearlayout); 
     final TextView pointsList = (TextView)findViewById(R.id.points_list); 
     ll.setOnTouchListener(this); 
     final Button listPoints = (Button)findViewById(R.id.list_points); 
     listPoints.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       StringBuilder sb = new StringBuilder(); 
       for (Vector2D vector : points) { 
        sb.append(
         "X:" +vector.getX() + " " + 
         "Y:" + vector.getY() + "\n"); 
       } 
       pointsList.setText(sb.toString()); 
      } 
     }); 
    } 
} 
+0

Ich denke, er fragt nach allen Touch-Events, nicht nur auf seine Anwendung. – Falmarri