私のプロジェクトの 1 つで、クリック ヒートマップのようなものを収集したいと考えています。Androidでこれを行う方法はありますか?
元のレイアウトの上に透明なレイアウトを追加し、そこをクリックして「ハイジャック」し、それを下のレイアウトに渡すことを考えていました。しかし、私はそれを理解することはできません。
それで、これを行う方法についてのアイデアはありますか?
私は自分で解決策を見つけました。それはonInterceptTouchEvent()
機能にあります。これをオーバーライドして、子ビューに渡される前にすべてのタッチ イベントをインターセプトできます。だから私はFrameLayoutを拡張するレイアウトを作成しました。私のレイアウトをこのレイアウトで囲みました。それだけです:)
特定のビューがクリックされた回数をキャプチャしたいだけですか? それとも、タッチの正確なピクセル座標が必要ですか? 前者の場合は、それぞれの 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());
}
});
}
}