【问题标题】:On Android Canvas polygons click在 Android Canvas 多边形上单击
【发布时间】:2013-12-01 23:09:24
【问题描述】:

我在 Canvas 上有几个多边形。 我怎样才能听到来自多边形的点击?

我有办法

public void drawPolygon(ChartPolygon polygon) {

        List<Point> points = polygon.getPoints();
        int size = points.size();
        if (size < 2) {
            return;
        }

        Paint polyPaint = new Paint();
        polyPaint.setColor(polygon.getColor());
        polyPaint.setStyle(Style.FILL);

        Path polyPath = new Path();
        polyPath.moveTo(points.get(0).getX(), points.get(0).getY());
        for (Point point : points) {
            polyPath.lineTo(point.getX(), point.getY());
        }
        canvas.drawPath(polyPath, polyPaint);
    }

【问题讨论】:

    标签: android onclick android-canvas polygon polygons


    【解决方案1】:

    阅读this post,这篇文章可以帮到你

    第一个,您可以获取屏幕中点击事件的 X 和 Y 位置。 可以在Activity extends中实现onTouchEvent函数

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
    
            if (topTouchArea.contains(event.getX(), event.getY())) {                
                currentTouch = TOUCH_TOP;
            } else if (RightTouchArea.contains(event.getX(),event.getY())) {                
                currentTouch = TOUCH_RIGHT;
            } else if (LeftTouchArea.contains(event.getX(),event.getY())) {            
                currentTouch = TOUCH_LEFT;
            } else {
                return false; //Return false if user touches none of the corners
            }
            return true; 
         }
      }
    

    现在(始终在您的 onTouchEvent 中)函数,您可以评估多边形的位置和区域。

    case MotionEvent.ACTION_MOVE:
    
            switch (currentTouch) {
            case TOUCH_TOP:              
                 top.x = event.getX();
                 top.y = event.getY();                            
                 invalidate();
                 return true;
            case TOUCH_RIGHT:                
                 Right.x = event.getX();
                 Right.y = event.getY();                
                 invalidate();
                 return true;
            case TOUCH_LEFT:                 
                 Left.x = event.getX();
                 Left.y = event.getY();             
                 invalidate();
                 return true;       
            }         
    
        case MotionEvent.ACTION_UP:
    
            switch (currentTouch) {
            case TOUCH_TOP:
                 top.x = event.getX();
                 top.y = event.getY();                
                 invalidate();
                 currentTouch = NONE;
                 return true;
            case TOUCH_RIGHT:
                 Right.x = event.getX();
                 Right.y = event.getY();             
                 invalidate();
                 currentTouch = NONE;
                 return true;
            case TOUCH_LEFT:
                Left.x = event.getX();
                 Left.y = event.getY();               
                 invalidate();
                 currentTouch = NONE;
                 return true;      
            }         
            return false;
    

    所有帖子都在article link

    【讨论】:

      【解决方案2】:

      我会保留地区列表。每当您绘制一个新的多边形时,请使用您用于绘制的相同路径来定义一个新区域:

      Region r = new Region();
      r.setPath(path, clip);
      regionList.add(r);
      

      clip 可以被定义,例如由

       Region clip = new Region(0, 0, canvas.getWidth(), canvas.getHeight());
      

      最后,当您在 onTouchListener 循环中检测到对 regionList 的触摸并检查触摸点(由 x 和 y 给出)是否在区域内时:

      for (int i = 0; i < regionList.size(); i++) {
          Region r = regionList.get(i);
          if (r.contains(x,y) {
              selectedRegionIndex = i;
              break;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        相关资源
        最近更新 更多