【问题标题】:Technique to make a canvas drawLine() clickable?使画布 drawLine() 可点击的技术?
【发布时间】:2013-08-16 13:55:37
【问题描述】:

我正在开发一个在地图上绘制节点的应用程序,每个节点都有由它们之间的线表示的边。我已经使用 Canvas 和 drawLine() 绘制了边缘,但如果线条本身可以是可点击的,那将会很有用。我的意思是一种允许用户触摸线或认为他们正在触摸线并且可以触发事件的方法。 (如显示边缘信息等...)

我无法正确地将触摸事件附加到我用 Canvas 绘制的线条上,因此我正在考虑将 ImageViews 放置在所绘制的每条边缘线的末端之间。 ImageView 可以是一个点,以便清楚触摸事件触发的位置。

还有人有其他建议吗?我主要是在寻找我错过的想法。也许 Android API 中有一些东西可以帮助我解决这个问题。

提前感谢您的任何提示!

【问题讨论】:

    标签: android android-canvas


    【解决方案1】:

    使用路径画线:

    Path linePath;
    Paint p;
    RectF rectF;
    float point1X, point1Y, point2X, point2Y;
    
    // initialize components
    
    // draw the line
    linePath.moveTo(point1X, point1Y); 
    linePath.lineTo(point2X, point2Y);
    
    canvas.drawPath(linePath, p);
    
    linePath.computeBounds(rectF, true);
    

    覆盖onTouchEvent(MotionEvent)

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    
        float touchX = event.getX();
        float touchY = event.getY();
    
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (rectF.contains(touchX, touchY)) {
                // line has been clicked
            }
            break;
        }
        return true;
    }
    

    【讨论】:

    • 只是在研究如何检测被触摸的路径。 View Canvas 将绘制多条线,因此会有多个 rectF 实例,我需要跟踪并知道哪些被触摸了。我正在考虑保留一个数组,在抽签期间创建,然后在触摸时翻阅数组以寻找命中。
    • @garlicman 是的,这是解决问题的一种方法。它绝对会奏效。 if 语句需要放在 for 块中:if (rectF[i].contains(touchX, touchY)) { // }
    • 应该在哪里启动 RectF?
    • 不画线
    猜你喜欢
    • 2023-04-04
    • 2012-01-16
    • 2015-02-25
    • 1970-01-01
    • 2020-06-29
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多