В одном из моих проектов я хочу собрать что-то вроде тепловой карты щелчка. Есть ли способ сделать это в 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 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());
}
});
}
}