gpt4 book ai didi

java - Android:在 SurfaceViev 上移动多个位图

转载 作者:行者123 更新时间:2023-11-29 09:10:31 27 4
gpt4 key购买 nike

我想用手指在表面 View 上移动两个简单的位图。使用一张位图,它工作正常,但我无法处理两个位图。我尝试使用 imageview onTouchListener,但后来我不得不使用 View.setX(float x),它是 API 级别 11,我不想超过 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);
}

}

最佳答案

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

首先,您需要存储两个对象的 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); -> images[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 的示例 How do I generate random integers within a specific range in Java?并在此处显示尺寸 Get screen dimensions in pixels

然后 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);
}
}

还要考虑您的对象是否可以重叠,如果不能重叠,您需要相应地加以防止。

希望这对您有所帮助。

关于java - Android:在 SurfaceViev 上移动多个位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com