2010-12-27 1 views
1

私のプロジェクトの1つでは、クリックヒートマップのようなものを収集したいと思います。 Androidでこれを行う方法はありますか?Android - ハイジャッククリック

元のレイアウトの上に透明なレイアウトを追加し、そこを「ハイジャック」して基本レイアウトに渡すことを考えていました。しかし、私はそれを理解することはできません。

だから、これを行う方法に関するアイデアはありますか?

+0

あなたはすべての活動のためにこれをしようとしていますか?それともあなたの活動だけ?明らかなセキュリティ上の理由から、これは他のアクティビティでは機能しません。 – Falmarri

+1

皆さん、ちょうど私自身が解決策を見つけました。 onInterceptTouchEvent関数の義務です。子ビューに渡される前に、すべてのタッチイベントを代行受信するようにオーバーライドすることができます。そこで、FrameLayoutを拡張したレイアウトを作成しました。このレイアウトと私のレイアウトを囲んで:) – Goddchen

+1

あなたは答えがある場合は、コメントではなく、答えとして投稿する必要があります。 –

答えて

1

私は解決策を自分自身を発見しました。それはonInterceptTouchEvent()機能にあります。子ビューに渡される前に、すべてのタッチイベントを代行受信するようにオーバーライドすることができます。そこで、FrameLayoutを拡張したレイアウトを作成しました。このレイアウトで私のレイアウトを囲んでそれをthats :)

0

特定のビューがクリックされた回数をキャプチャしたいだけですか?または、タッチの正確なピクセル座標を求めていますか?前者の場合は、それぞれのonTouchListenerをオーバーライドして、そのビューのカウンタをインクリメントします。

後者の場合、私はonTouchListenerを使って少し演奏していましたが、それを動作させることができましたが、大したことではないはずのすべてのビューにonTouchListenerを設定する必要があります誰かがより良い方法を持っていなければ心に留めておくだけのものです。

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

彼は彼のアプリケーション上だけでなく、すべてのタッチイベントを求めていると思います。 – Falmarri

関連する問題