当我投影图像视图时,我正在尝试运行一个非常简单的2D动画。我参与了2项活动。
GameCanvas
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
if(GameWindow.getContext() == null)
return false;
if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom()))
{
try
{
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left slap
if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingLeft = true;
//Animate Slap
GameWindow.update();
if(!running)
running = true;
}
else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingRight = true;
//Animate Slap
GameWindow.update();
if(!running )
running = true;
}
}
catch (Exception e)
{
//nothing
}
}
slappingLeft = slappingRight = running = false;
return true;
}
GameWindow
private RefreshHandler mRedrawHandler = new RefreshHandler();
class RefreshHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
GameWindow.this.update();
GameWindow.this.invalidate();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void update()
{
//animate slap
if(GameCanvas.slappingLeft)
{
for(int i = 0; i < 500; i+=100)
{
GameCanvas.SlapLeft();
mRedrawHandler.sleep(100);
}
GameCanvas.SetImage();
//this.invalidate();
}
else if(GameCanvas.slappingRight)
{
for(int i = 0; i < 500; i+=100)
{
GameCanvas.SlapImage();
mRedrawHandler.sleep(100);
}
GameCanvas.SetImage();
//this.invalidate();
}
}
如果有人帮我解决这个问题,我将不胜感激。我已经尝试了很多不同的方法解决这个问题。
我只想显示SlapImage半秒钟,然后恢复到正常图像,直到再次调用onFling。
如果您想查看SetImage(),SlapLeft()和SetImage(),请告诉我们!
非常感谢!
修改 的
GameCanvas不是Canvas obj。它是一个setContentView(R.layout.game_canvas)
的活动GameWindow是一个自定义ImageView
答案 0 :(得分:0)
我在你的代码中发现了问题。也许这是对结果的影响,但我不确定。问题是你应该在if语句中使用括号,因为operator&amp;&amp;优先于比较运营商。因此,您的代码应该以下列方式查找:
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
if(GameWindow.getContext() == null)
return false;
if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom()))
{
try
{
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left slap
if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingLeft = true;
//Animate Slap
GameWindow.update();
if(!running)
running = true;
slappingLeft = false;
}
else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingRight = true;
//Animate Slap
GameWindow.update();
if(!running)
running = true;
slappingRight = false;
}
}
catch (Exception e)
{
//nothing
}
}
running = false;
return false;
}
我不知道这对你的代码的逻辑是否有影响,但在我看来是的。
答案 1 :(得分:0)
经过一番考虑,我决定实施这个解决方案。我认为它运作得相当好。
我仍然不确定为什么我以前的方式不起作用。如果有人还想详细说明我会很感激。
的GameCanvas。我创建了这个帖子。
resetSlap = new Thread()
{
public void run()
{
while(true)
{
try
{
Thread.sleep(500);
GameWindow.post(new Runnable()
{
public void run()
{
GameWindow.setImageBitmap(images[0]);
GameWindow.postInvalidate();
}
});
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
};
顺便说一句,每半秒钟我想将图像重置为正常
然后在我写的OnFling中
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
if(GameWindow.getContext() == null)
return false;
if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom()))
{
try
{
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left slap
if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) &&
(Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingLeft = true;
//Animate Slap
SlapLeft();
SlapSound();
if(voice.nextInt(10) < 3)
{
Voice.start();
}
}
// left to right slap
else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) &&
(Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))
{
slappingRight = true;
//Animate Slap
SlapImage();
SlapSound();
if(voice.nextInt(10) < 3)
{
Voice.start();
}
}
}
catch (Exception e)
{
//nothing
}
}
slappingLeft = slappingRight = false;
return true;
}
基本上,如果我向左倾斜,我会调用Slap并等待线程重置,如果我正在拍打,我会调用Slap Right并等待线程重置。
这个答案适用于我的情况..我希望这会有所帮助:D
谢谢大家的帮助。