当包含其他视图android

时间:2016-09-06 07:45:39

标签: android google-maps rectangles

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

提前致谢。

这是我的 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 个答案:

答案 0 :(得分:1)

内部方法onTouch返回false。它告诉系统,没有发送触摸。伪代码:

if (rectangleTouched)
    return true;
else return false;

来自Android docs

  

boolean onTouchEvent(MotionEvent event)

     

返回:   boolean如果事件被处理则为True,否则为false。