2016-09-06 84 views
0

我已经创建自定义视图和包括里面fragment.but问题是地图触摸不工作,因为矩形视图完成warp_content后获得完整的屏幕分辨率。 当我绘制谷歌地图上方的可调整大小的矩形地图触摸不起作用。 这个主要活动XML,我想包括这个矩形视图。 请给我任何想法。 “com.My-application.activities.rectangle”是我添加这个类的包。实际上我想让两个工作在同一时间地图也滚动和矩形。 请推荐我正确的方法。因此,我可以解决我的问题。谷歌地图不工作时,包括其他视图android

在此先感谢。

这是我XML文件

 <Relative-layout 
     android:id="@+id/inner_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <fragment 
     android:id="@+id/map_fragment" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

      <com.Myapplication.activities.rectangle 
      android:id="@+id/drawView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true"/>     
    </RelativeLayout> 

这是我的课在那里我创建的矩形图。

public class rectangle extends View { 
     Point[] points = new Point[4]; 
     /** 
     * point1 and point 3 are of same group and same as point 2 and point4 
     */ 
     int groupId = -1; 
     private ArrayList<ColorBall> colorballs = new ArrayList<ColorBall>(); 
     // array that holds the balls 
     private int balID = 0; 
     // variable to know what ball is being dragged 
     Paint paint; 
     Canvas canvas; 


     public rectangle(Context context) { 
      super(context); 
      paint = new Paint(); 
      setFocusable(true); // necessary for getting the touch events 
      canvas = new Canvas(); 

     } 


     public rectangle(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
     } 

     public rectangle(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      paint = new Paint(); 
      setFocusable(true); // necessary for getting the touch events 
      canvas = new Canvas(); 
     } 

     // the method that draws the balls 
     @Override 
     protected void onDraw(Canvas canvas) { 
      if(points[3]==null) //point4 null when user did not touch and move on screen. 
       return; 
      int left, top, right, bottom; 
      left = points[0].x; 
      top = points[0].y; 
      right = points[0].x; 
      bottom = points[0].y; 
      for (int i = 1; i < points.length; i++) { 
       left = left > points[i].x ? points[i].x:left; 
       top = top > points[i].y ? points[i].y:top; 
       right = right < points[i].x ? points[i].x:right; 
       bottom = bottom < points[i].y ? points[i].y:bottom; 
      } 
      paint.setAntiAlias(true); 
      paint.setDither(true); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeWidth(5); 

      //draw stroke 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setColor(Color.parseColor("#AADB1255")); 
      paint.setStrokeWidth(2); 
      canvas.drawRect(
        left + colorballs.get(0).getWidthOfBall()/2, 
        top + colorballs.get(0).getWidthOfBall()/2, 
        right + colorballs.get(2).getWidthOfBall()/2, 
        bottom + colorballs.get(2).getWidthOfBall()/2, paint); 
      //fill the rectangle 
      paint.setStyle(Paint.Style.FILL); 
      paint.setColor(Color.parseColor("#25DB1255")); 
      paint.setStrokeWidth(0); 
      canvas.drawRect(
        left + colorballs.get(0).getWidthOfBall()/2, 
        top + colorballs.get(0).getWidthOfBall()/2, 
        right + colorballs.get(2).getWidthOfBall()/2, 
        bottom + colorballs.get(2).getWidthOfBall()/2, paint); 

      //draw the corners 
      BitmapDrawable bitmap = new BitmapDrawable(); 
      // draw the balls on the canvas 
      paint.setColor(Color.BLUE); 
      paint.setTextSize(18); 
      paint.setStrokeWidth(0); 
      for (int i =0; i < colorballs.size(); i ++) { 
       ColorBall ball = colorballs.get(i); 
       canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), 
         paint); 

       canvas.drawText("" + (i+1), ball.getX(), ball.getY(), paint); 
      } 
     } 

     // events when touching the screen 
     public boolean onTouchEvent(MotionEvent event) { 
      int eventaction = event.getAction(); 

      int X = (int) event.getX(); 
      int Y = (int) event.getY(); 

      switch (eventaction) { 

       case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on 
        // a ball 
        if (points[0] == null) { 

         //initialize rectangle. 

         points[0] = new Point(); 
         points[0].x = X; 
         points[0].y = Y; 

         points[1] = new Point(); 
         points[1].x = X; 
         points[1].y = Y + 30; 

         points[2] = new Point(); 
         points[2].x = X + 30; 
         points[2].y = Y + 30; 

         points[3] = new Point(); 
         points[3].x = X +30; 
         points[3].y = Y; 

         balID = 2; 
         groupId = 1; 
         // declare each ball with the ColorBall class 
         for (Point pt : points) { 
          colorballs.add(new ColorBall(getContext(), R.drawable.ic_slide, pt)); 

         } 



        } else { 
         //resize rectangle 
         balID = -1; 
         groupId = -1; 
         for (int i = colorballs.size()-1; i>=0; i--) { 
          ColorBall ball = colorballs.get(i); 
          // check if inside the bounds of the ball (circle) 
          // get the center for the ball 
          int centerX = ball.getX() + ball.getWidthOfBall(); 
          int centerY = ball.getY() + ball.getHeightOfBall(); 
          paint.setColor(Color.CYAN); 
          // calculate the radius from the touch to the center of the 
          // ball 
          double radCircle = Math 
            .sqrt((double) (((centerX - X) * (centerX - X)) + (centerY - Y) 
              * (centerY - Y))); 

          if (radCircle < ball.getWidthOfBall()) { 

           balID = ball.getID(); 
           if (balID == 1 || balID == 3) { 
            groupId = 2; 
           } else { 
            groupId = 1; 
           } 

           invalidate(); 
           break; 
          } 
          invalidate(); 
         } 
        } 
        break; 

       case MotionEvent.ACTION_MOVE: // touch drag with the ball 
        if (balID > -1) { 
         // move the balls the same as the finger 

         colorballs.get(balID).setX(X); 
         colorballs.get(balID).setY(Y); 

         paint.setColor(Color.CYAN); 
         if (groupId == 1) { 
          colorballs.get(1).setX(colorballs.get(0).getX()); 
          colorballs.get(1).setY(colorballs.get(2).getY()); 
          colorballs.get(3).setX(colorballs.get(2).getX()); 
          colorballs.get(3).setY(colorballs.get(0).getY()); 
         } else { 
          colorballs.get(0).setX(colorballs.get(1).getX()); 
          colorballs.get(0).setY(colorballs.get(3).getY()); 
          colorballs.get(2).setX(colorballs.get(3).getX()); 
          colorballs.get(2).setY(colorballs.get(1).getY()); 
         } 

         invalidate(); 
        } 

        break; 

       case MotionEvent.ACTION_UP: 
        // touch drop - just do things here after dropping 

        break; 
      } 
      // redraw the canvas 
      invalidate(); 
      return true; 

     } 


    } 

回答

1

内部方法onTouch返回false。它对系统说,那触摸没有被调动。伪代码:

if (rectangleTouched) 
    return true; 
else return false; 

Android docs

布尔的onTouchEvent(MotionEvent事件)

返回: Boolean如果事件已经被处理,否则为false。

+0

返回false后,地图正在移动,但不是矩形。 – Umesh

+0

@umesh你必须检测,如果触摸矩形边界。如果是 - 返回true,如果不返回false –