Android - Hijack щелкает [закрыт]

1

В одном из моих проектов я хочу собрать что-то вроде тепловой карты щелчка. Есть ли способ сделать это в Android?

Я подумывал о добавлении прозрачного макета над исходным макетом и "хитрости" щелчков, а затем передать его в базовый макет. Но я не могу понять.

Итак, какие-либо идеи о том, как это сделать?

  • 0
    Вы пытаетесь сделать это для всех видов деятельности? Или только твоя деятельность? Это не будет работать для других действий по очевидным причинам безопасности.
  • 1
    Привет всем, я просто нашел решение сам. Это в функции onInterceptTouchEvent. Вы можете переопределить его, чтобы перехватывать все сенсорные события, прежде чем передать его дочерним представлениям. Поэтому я создал макет, расширяющий FrameLayout. Окружил мой макет этим макетом и все :)
Показать ещё 2 комментария
Теги:
click
heatmap

2 ответа

1
Лучший ответ

Я сам нашел решение. Он находится в функции onInterceptTouchEvent(). Вы можете переопределить его, чтобы перехватить все события касания, прежде чем передать их дочерним представлениям. Поэтому я создал макет, расширяющий FrameLayout. Окруженный мой макет с этим макетом, и вот он:)

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 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
    Я думаю, что он спрашивает обо всех событиях касания, не только о его заявлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню