2

我想用手指在表面视图上移动两个简单的位图。使用一个位图,它工作正常,但我无法处理两个位图。我使用 imageview onTouchListener 进行了尝试,但后来我不得不使用 API 级别 11 的 View.setX(float x) 并且我不想超过 API 级别 8。我该如何实现它?

    public class ItemClass extends SurfaceView implements SurfaceHolder.Callback, Runnable {

    private SurfaceHolder surface;
    private Paint p = new Paint();
    private Bitmap[] item = new Bitmap[2];
    private int[] coord = new int[2];

    public DrawClass(Context context) {
        super(context);
        getHolder().addCallback(this);
        surface = getHolder();
        item[0] = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        item[1] = BitmapFactory.decodeResource(getResources(), R.drawable.img2);        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        Thread drawThread = new Thread(this);
        drawThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}

    @Override
    public void run() {

        Canvas c;
        while (true) {
            c = null;
            try {
                c = surface.lockCanvas(null);
                synchronized (surface) {
                    onDraw(c);

                }
            } finally {
                if (c != null) {
                    surface.unlockCanvasAndPost(c);
                }
            }
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        coord[0]=(int)event.getX();
        coord[1]=(int)event.getY();

        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);

        canvas.drawBitmap(item[0], coord[0], coord[1], null);
        canvas.drawBitmap(item[1], 100, 100, null);
    }

}
4

1 回答 1

0

好的,这是一个简化答案的尝试,假设您使用的是矩形位图(无透明度)。

首先,您需要存储两个对象的 x、y 坐标和宽度、高度。我建议为您的位图创建一个自定义类,而不是当前位图数组 Bitmap[] 项:

private class MyImage{
            Bitmap image;
            int x,y,w,h;
        }
private MyImage[] images = new MyImage[2];

您将不得不相应地更改您的代码,例如。item[0] = BitmapFactory.decodeResource(getResources(), R.drawable.img1); -> 图像[0].image = BitmapFactory.decodeResource(getResources(), R.drawable.img1);

坐标[0] -> 图像[0].x

坐标[1] -> 图像[0].y

您可以从图像中获取宽度和高度属性,例如:

images[0].h = images[0].image.getHeight();
images[0].w = images[0].image.getWidth();

根据您的偏好 - 为这些图像提供固定的 x,y 值,或者您可以在屏幕尺寸内给它们随机值。请参阅示例如何在此处使用 Math.random如何在 Java 中生成特定范围内的随机整数?并在此处显示大小以像素为单位获取屏幕尺寸

然后 onTouchEvent 检查 x,y 是否在您的一个图像内并且是 - 而不是仅移动该图像。就像是:

for (int i = 0; i<=images.length; i++){
            //if touch event is inside this image - move it
            if (coord[0] >= (images[i].x) && coord[0] <= (images[i].x+images[i].w) &&
                    coord[1] >= (images[i].y) && coord[1] <= (images[i].y+images[i].h) ){
                //offset the image by the distance of the touch event from the center of the image
                images[i].x += coord[0] - (images[i].x+images[i].w/2);
                images[i].y += coord[1] - (images[i].y+images[i].h/2);
                canvas.drawBitmap(images[i].image, images[i].x, images[i].y, null);
            } else {
                //draw the iamge at its old position
                canvas.drawBitmap(images[i].image, images[i].x, images[i].y, null);
            }
        }

还要考虑您的对象是否可以重叠,如果没有,您需要相应地防止这种情况。

希望这可以帮助。

于 2012-10-05T03:12:36.623 回答