【发布时间】:2023-03-23 06:47:01
【问题描述】:
我没有使用 libgdx lib 来创建按钮和菜单,而是为此编写了自己的代码。
但是现在我在动画按钮中遇到了非常奇怪的问题。
我已经为按钮实现了非常简单的动画。如果按钮被触摸(即触摸屏被触摸,但未释放),我将按钮图像向右移动 x = 1px,向下移动 y = 1px。释放触摸屏时,按钮图像重置为其原始位置,即 x = 1px 左和 y = 1px 上;
这是我实现 Button 的方式:
public class MenuInputHandler implements InputProcessor {
....
MenuScreen menuscreen;
public MenuInputHandler(MenuScreen menuScreen) {
this.menuScreen = menuScreen;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
if(pointer==0)
{
this.menuScreen.setTouchStartAnimation(screenX,screenHeight-screenY);
return true;
}
else
return true;
// just ignoring in case of multi touch...
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
this.menuScreen.setTouchStopAnimation();
return true;
}
}
MenuScreen 类 ...
public class MenuScreen implements Screen{
public enum MENU {PLAY,RATE,SOUND,NONE};
public MENU menuTouched,menuToLoad;
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render(float arg0) {
// other graphics code here....
...
...
spriteBatch.draw(soundIcon,soundButtonStartX+soundAnimationOffsetX,
soundButtonStartY-soundAnimationOffsetY,
iconHeight,iconHeight);
/// similarly .. for other button images .....
// this is where I load menu...
if(menuToLoad != MENU.NONE)
{
loadMenus();
}
}
@Override
public void resize(int arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
}
public void setTouchStartAnimation(int x,int y)
{
if(menuTouched!=MENU.NONE)
return;
// soundbound is a rectangle with coordinates for touch area...
if((soundBound.contains(x, y))
{menuTouched = MENU.SOUND;
soundMenuAnimationOffsetX = .1f;
soundMenuAnimationOffsetY = .1f;
}
else if ......
/// similarly for other...
}
public void setTouchStopAnimation()
{
// stop currently running animation
switch(menuTouched)
{
case SOUND:
soundMenuAnimationOffsetX = 0f;
soundMenuAnimationOffsetY = 0f;
menuToLoad = MENU.SOUND;
break;
/// similarly for RATE menu ... and others...
}
}
public void loadMenus()
{
switch(menuToLoad)
{
case PLAY:
// reseting menuToLoad
menuToLoad = MENU.NONE;
// loading whatever is touched .... new Menu etc...
onTouchPlay();
break;
case SOUND:
menuToLoad = MENU.NONE;
onTouchSound();
break;
case RATE:
menuToLoad = MENU.NONE;
onTouchRate();
break;
}
}
public void onTouchRate()
{
// create intent and start new activity from MainActivity....
}
public void onTouchSound()
{
// unable disable sound .....
// no new screen loaded...
// just 2, 3 line of code....
}
public void onTouchPlay()
{
// load game screen.....
}
}
所以,如果我触摸声音按钮、播放按钮等,它的动画每次都能完美运行,没有任何问题。即当我触摸屏幕时,图像以给定的偏移量移动,给人一种事件发生的感觉,当我释放触摸时,图像移动回原来的位置,因为动画偏移量被重置为 0;
但是,如果我触摸将创建意图并启动活动选择器或直接启动新活动的速率按钮,则会看到以下差异..
有时动画效果与声音按钮的情况一样完美。
1234563 ,当我释放触摸时!!!)即使我在 setTouchStopAnimation() 中将偏移变量设置为 0。然后它将按预期加载新的活动,然后一旦活动完成并恢复游戏活动,按钮图像就会移动到原始位置。
有时根本看不到动画。(这可能是因为处理得太快了,因为我没有使用任何延迟!!).. 目前没有问题!...或任何其他原因?
问题仅出现在侦听器开始新活动的按钮上!
我应该更好地为菜单和按钮使用 libgdx lib 以避免这种行为。
谢谢 蓓蓓
【问题讨论】:
-
可能不是根本原因,但如果
touchDown确实如此,您的touchUp方法也应该忽略0 以外的指针。在您的render方法中,您是否有if可能导致不绘制任何内容的语句? (你描述的闪烁听起来像是旧帧重新出现。) -
渲染方法在我的例子中非常简单。它将使用 spriteBatch 渲染图像,最后只有一个,如果它会检查 menuToLoad.
标签: android animation button android-activity libgdx