Android - 劫持点击

时间:2010-12-27 17:02:07

标签: android click heatmap

在我的一个项目中,我想收集类似点击热图的内容。 有没有办法在Android中执行此操作?

我在考虑在原始布局上方添加透明布局,并在那里“劫持”,然后将其传递给底层布局。但我无法理解。

那么,关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

我自己刚刚找到了解决方案。它位于onInterceptTouchEvent()函数中。在切换到子视图之前,您可以覆盖它以拦截所有触摸事件。所以我创建了一个扩展FrameLayout的布局。用这种布局包围我的布局,就是这样:))

答案 1 :(得分: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());
            }
        });
    }
}