在矩形画布内的触摸事件上调整位图图像的大小

时间:2014-08-09 20:47:12

标签: android android-canvas android-bitmap

我想在此矩形代码中添加图像(位图),以便图像也相应地重新调整大小。拖动终点时请帮我解决这个问题。

我只是想知道在哪里添加位图图像,以便它适合下面提到的矩形代码。

public class Rectangler 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 Rectangler(Context context) 
        {
            super(context);
            paint = new Paint();
            setFocusable(true); // necessary for getting the touch events
            canvas = new Canvas();
        }

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

        public Rectangler(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("#55DB1255"));
            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);

            Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                    R.drawable.eight);
            canvas.drawBitmap(bmp, colorballs.get(10).getX(), colorballs.get(10).getY(), null);
            //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_circle, 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;

        }
    }

这是我的彩球类

class ColorBall {

    Bitmap bitmap;
    Context mContext;
    Point point;
    int id;
    static int count = 0;

    public ColorBall(Context context, int resourceId, Point point) {
        this.id = count++;
        bitmap = BitmapFactory.decodeResource(context.getResources(),
                resourceId);
        mContext = context;
        this.point = point;
    }

    public int getWidthOfBall() {
        return bitmap.getWidth();
    }

    public int getHeightOfBall() {
        return bitmap.getHeight();
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public int getX() {
        return point.x;
    }

    public int getY() {
        return point.y;
    }

    public int getID() {
        return id;
    }

    public void setX(int x) {
        point.x = x;
    }

    public void setY(int y) {
        point.y = y;
    }
}

0 个答案:

没有答案