3

在此处输入图像描述

 @Override protected void onDraw(Canvas canvas) {
                //canvas.drawPicture();
                canvas.drawColor(Color.CYAN);
                Paint p= new Paint();
                p.setColor(Color.RED);
                p.setStrokeWidth(20);
                canvas.drawLine(100, 200, 400, 500, p);
                if(movingObjects.size() > 0){
                for (MovingObject ball : movingObjects) {
                    canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
                  }
                }

            }

            public boolean onTouchEvent(MotionEvent event) {
                int eventaction = event.getAction(); 

                int X = (int)event.getX(); 
                int Y = (int)event.getY(); 
                boolean redraw = false;
                switch (eventaction ) { 

                case MotionEvent.ACTION_DOWN:
                    currentMovingObjectId = 0;
                    for (MovingObject movingObject : movingObjects) {

                        int topLeftX = movingObject.getX() ;
                        int topLeftY = movingObject.getY() ;

                        double imageSize = movingObject.getSize();
                        double radCircle  = Math.sqrt( (double) (((topLeftX-X)*(topLeftX-X)) + (topLeftY-Y)*(topLeftY-Y)));

                        if ( (radCircle < imageSize) && 
                                (X- topLeftX) < movingObject.getWidth() && (Y - topLeftY) <  movingObject.getHeight() && 
                                (X- topLeftX) > 0 &&  (Y- topLeftY) > 0){
                            currentMovingObjectId = movingObjects.indexOf(movingObject) + 1;
                            offsetX = X- topLeftX;
                            offsetY = Y - topLeftY;
                            redraw = true;
                            break;
                        }
                      }

                     break; 


                case MotionEvent.ACTION_MOVE:   

                    if ( currentMovingObjectId > 0) {
                        drawAtX = X - offsetX;
                        drawAtY = Y - offsetY;

                        if(drawAtX < 0 || (drawAtX + movingObjects.get(currentMovingObjectId-1).getWidth()) > MovingObject.screenWidth)
                            drawAtX = movingObjects.get(currentMovingObjectId-1).getX();
                        if(drawAtY < 0 || (drawAtY + movingObjects.get(currentMovingObjectId-1).getHeight()) > MovingObject.screenHeight)
                            drawAtY = movingObjects.get(currentMovingObjectId-1).getY();

                        if(drawAtX != movingObjects.get(currentMovingObjectId-1).getX() || drawAtY != movingObjects.get(currentMovingObjectId-1).getY()){
                            movingObjects.get(currentMovingObjectId-1).setX(drawAtX);
                            movingObjects.get(currentMovingObjectId-1).setY(drawAtY);
                            redraw = true;
                        }
                    }

                    break; 

                case MotionEvent.ACTION_UP: 

                     break; 
                } 
                if(redraw)
                    invalidate(); 
                return true; 

            }

上面的代码描述了我的自定义视图类中的 onTouch 和 onDraw 方法,我必须防止图像越线。因为我们可以使用矩阵来实现,我们可以通过将墙设置在 4 个侧面来水平和垂直移动对象以避免对象单元格,但我必须在拼图中自由移动对象。任何逻辑都会对我有所帮助。提前致谢

4

0 回答 0