私のプロジェクトの1つでは、クリックヒートマップのようなものを収集したいと思います。 Androidでこれを行う方法はありますか?Android - ハイジャッククリック
元のレイアウトの上に透明なレイアウトを追加し、そこを「ハイジャック」して基本レイアウトに渡すことを考えていました。しかし、私はそれを理解することはできません。
だから、これを行う方法に関するアイデアはありますか?
私のプロジェクトの1つでは、クリックヒートマップのようなものを収集したいと思います。 Androidでこれを行う方法はありますか?Android - ハイジャッククリック
元のレイアウトの上に透明なレイアウトを追加し、そこを「ハイジャック」して基本レイアウトに渡すことを考えていました。しかし、私はそれを理解することはできません。
だから、これを行う方法に関するアイデアはありますか?
私は解決策を自分自身を発見しました。それはonInterceptTouchEvent()
機能にあります。子ビューに渡される前に、すべてのタッチイベントを代行受信するようにオーバーライドすることができます。そこで、FrameLayoutを拡張したレイアウトを作成しました。このレイアウトで私のレイアウトを囲んでそれをthats :)
特定のビューがクリックされた回数をキャプチャしたいだけですか?または、タッチの正確なピクセル座標を求めていますか?前者の場合は、それぞれの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());
}
});
}
}
彼は彼のアプリケーション上だけでなく、すべてのタッチイベントを求めていると思います。 – Falmarri
あなたはすべての活動のためにこれをしようとしていますか?それともあなたの活動だけ?明らかなセキュリティ上の理由から、これは他のアクティビティでは機能しません。 – Falmarri
皆さん、ちょうど私自身が解決策を見つけました。 onInterceptTouchEvent関数の義務です。子ビューに渡される前に、すべてのタッチイベントを代行受信するようにオーバーライドすることができます。そこで、FrameLayoutを拡張したレイアウトを作成しました。このレイアウトと私のレイアウトを囲んで:) – Goddchen
あなたは答えがある場合は、コメントではなく、答えとして投稿する必要があります。 –