Java 启动位图

Java 启动位图,java,android,animation,android-canvas,Java,Android,Animation,Android Canvas,我有一个绘制位图的surface view类,在将对象从屏幕中央底部启动到用户单击屏幕的位置时遇到了一些问题,下面是一个代码片段 onTouch方法通过用户在屏幕上的触摸获取坐标,然后run方法绘制位图。岩石位图是我需要从屏幕底部移动到触摸的地方 public boolean onTouch(View arg0, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTI

我有一个绘制位图的surface view类,在将对象从屏幕中央底部启动到用户单击屏幕的位置时遇到了一些问题,下面是一个代码片段 onTouch方法通过用户在屏幕上的触摸获取坐标,然后run方法绘制位图。岩石位图是我需要从屏幕底部移动到触摸的地方

           public boolean onTouch(View arg0, MotionEvent event) {


    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        x = event.getX();
        y = event.getY();
        sX = event.getX();
        sY = event.getY();
        fX = fY = dX = dY = sclX = sclY = aniX = aniY = 0;
        break;
    case MotionEvent.ACTION_UP:
        fX = event.getX();
        fY = event.getY();
        dX = fX - sX;
        dY = fY - sY;
        sclX = dX / 30;
        sclY = dY / 30;

        break;
    }
    return true;
}

        //the code that draws and updates the bitmaps on screen
        public void run() {
        while (running) {
            if (!sh.getSurface().isValid())
                continue;

            canvas = sh.lockCanvas();
            canvas.drawRGB(02, 02, 150);
            if (x != 0 && y != 0)
                canvas.drawBitmap(cross, x - (cross.getWidth() / 2), y- (cross.getHeight() / 2), null);

            canvas.drawBitmap(sling,(canvas.getWidth() / 2) - (sling.getHeight() / 2),canvas.getHeight() - sling.getHeight(), null);
            if (fX != 0 && fY != 0) {
                canvas.drawBitmap(rock, (canvas.getWidth()/2) - aniX,(canvas.getHeight()- sling.getHeight()) - aniY,null);

            }

            aniX = aniX + sclX;
            aniY = aniY + sclY;

            sh.unlockCanvasAndPost(canvas);
        }

    }

您的
onTouch()
中缺少了一些重要的内容

这段代码有一个逻辑问题。在下面的例子中,考虑你在100/100上的点击,<代码> SX和<代码> Sy/Cube >设置为100。在向上的情况下,您可以在
fX
fY
中获得向上坐标,也就是100。这将导致
dX=fX-sX
=>
dX=100-100
。因此,您的
sclX
也将是
0
。这意味着根本没有动画


您应该使用屏幕中间作为计算的基础。源是屏幕中心,目标是您的触摸。

请尝试此链接,谢谢您的链接,但我已经有了表面视图逻辑,我正在寻找更多关于如何使图像从屏幕底部发射到用户单击的位置的信息。如我在回答中所述,不可能使用for循环进行动画。这会是一个可行的解决方案。一个基本的动画可以像OP一样由绘图过程触发。尽管最基本的问题是遗漏的计算。如果计算的速度为0,则无法设置某个对象的动画。我想你错过了我回答的那一部分@Ashwin:I同意基本问题是错过计算。你是对的,如果你有源点和目标点,你可以设置动画,我认为OP搞错了。一旦他得到了正确的源和目标,他就可以使用for循环。我说的是在while循环中使用for循环。我正在绘制从源到目标的位图,以产生运动效果。我认为这就是OP想要的。@Ashwin不认为这是针对个人的,但一段时间内,仅仅为了一些动画是不好的编码。此外,睡眠(10)绝对没有影响(至少在60hz设备上),因为每次锁定/解锁的速度不会超过每秒60次(意味着每16.6毫秒)。所以睡眠只会导致fps变慢。。。
public boolean onTouch(View arg0, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        x = event.getX();
        y = event.getY();
        sX = event.getX();
        sY = event.getY();
        fX = fY = dX = dY = sclX = sclY = aniX = aniY = 0;
        break;
      case MotionEvent.ACTION_UP:
        fX = event.getX();
        fY = event.getY();
        dX = fX - sX;
        dY = fY - sY;
        sclX = dX / 30;
        sclY = dY / 30;

        break;
    }
    return true;
}