Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 查找精灵相对于背景图像的位置_Android_Image_Scroll - Fatal编程技术网

Android 查找精灵相对于背景图像的位置

Android 查找精灵相对于背景图像的位置,android,image,scroll,Android,Image,Scroll,有人能告诉我如何找出精灵图像相对于背景图像的相对位置吗? i、 e.平移(滚动)背景时,图像应随背景移动。精灵是背景图像的子对象吗?如果没有,可以使用名为localtoGlobal的方法,该方法将点对象从精灵的(本地)坐标转换为背景的(全局)坐标 一种可能的解决方案是使用虚拟x和y精灵位置,并具有原点x和y位置(位于屏幕左上角) 当您想要滚动屏幕时,只需修改原点x和y位置 然后,无论你在屏幕上画什么,你都需要从虚拟位置减去原点位置 例如 无论何时移动任何精灵,都会操纵其“虚拟”x和y位置。如果通

有人能告诉我如何找出精灵图像相对于背景图像的相对位置吗?
i、 e.平移(滚动)背景时,图像应随背景移动。

精灵是背景图像的子对象吗?如果没有,可以使用名为localtoGlobal的方法,该方法将点对象从精灵的(本地)坐标转换为背景的(全局)坐标


一种可能的解决方案是使用虚拟x和y精灵位置,并具有原点x和y位置(位于屏幕左上角)

当您想要滚动屏幕时,只需修改原点x和y位置

然后,无论你在屏幕上画什么,你都需要从虚拟位置减去原点位置

例如

无论何时移动任何精灵,都会操纵其“虚拟”x和y位置。如果通过减去原点将虚拟的x,y转换为实际的屏幕x,y,所有的东西都会一起移动


现在,例如,如果你想让背景从右向左滚动,你只需将每一帧添加到originX中。

好的……为了在滚动时使精灵与背景一起移动, 代码是:

初始化

PointF touchStart = new PointF();
PointF picStart = new PointF();
PointF prevPicStart = new PointF();
并在onTouchEvent()方法中实现:


这被标记为android问题。是否修改原点X和Y?这不会从那一点重新画出整个画面吗?这个例子会很有帮助。是的,它会重新绘制整个图像,这是滚动背景的基础。
PointF touchStart = new PointF();
PointF picStart = new PointF();
PointF prevPicStart = new PointF();
@Override
public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

    case MotionEvent.ACTION_DOWN:

            touchStart.set(ev.getX(), ev.getY());
            x = ev.getX();
            y = ev.getY();

        break;

    case MotionEvent.ACTION_MOVE: {

        newX = ev.getX() - touchStart.x + prevPicStart.x;
        newY = ev.getY() - touchStart.y + prevPicStart.y;

        if ((newX <= 0 && newX > 0 - BG_image.getWidth() + ActivityClass.DISP_WIDTH)) {
            picStart.x = newX;
        }

        if ((newY <= 0 && newY > 0 - BG_image.getHeight() + ActivityClass.DISP_HEIGHT)) {
            picStart.y = newY;
        }

        invalidate();
        break;
    }

    case MotionEvent.ACTION_UP:

        prevPicStart.x = picStart.x;
        prevPicStart.y = picStart.y;

        break;

    }
    return true;
}
@Override
protected void onDraw(Canvas canvas) {
    Paint paint = new Paint();
    canvas.drawBitmap(mBG_l1, picStart.x, picStart.y, paint);

    canvas.translate(picStart.x, picStart.y);
   person.draw(canvas);
    }