【问题标题】:libgdx button image animation strange behavior when starting new activity开始新活动时的libgdx按钮图像动画奇怪行为
【发布时间】: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;

但是,如果我触摸将创建意图并启动活动选择器或直接启动新活动的速率按钮,则会看到以下差异..

  1. 有时动画效果与声音按钮的情况一样完美。

  2. 1234563 ,当我释放触摸时!!!)即使我在 setTouchStopAnimation() 中将偏移变量设置为 0。然后它将按预期加载新的活动,然后一旦活动完成并恢复游戏活动,按钮图像就会移动到原始位置。
  3. 有时根本看不到动画。(这可能是因为处理得太快了,因为我没有使用任何延迟!!).. 目前没有问题!...或任何其他原因?

问题仅出现在侦听器开始新活动的按钮上!

我应该更好地为菜单和按钮使用 libgdx lib 以避免这种行为。

谢谢 蓓蓓

【问题讨论】:

  • 可能不是根本原因,但如果touchDown 确实如此,您的touchUp 方法也应该忽略0 以外的指针。在您的 render 方法中,您是否有 if 可能导致不绘制任何内容的语句? (你描述的闪烁听起来像是旧帧重新出现。)
  • 渲染方法在我的例子中非常简单。它将使用 spriteBatch 渲染图像,最后只有一个,如果它会检查 menuToLoad.

标签: android animation button android-activity libgdx


【解决方案1】:

似乎是 GL 线程问题

 public void onTouchRate()
 { 
     // create intent  and start new activity from MainActivity....
 }

此代码可能耗时过长,并且冻结了 GL 渲染线程(它也处理事件)。这可能会使系统错过一些事件和意外行为。

无论您使用什么库,事件处理程序都应该很小(计算成本低)。如果该代码耗时过长,请考虑将其转移到某个后台线程并立即释放 Event Dispatch 线程。

注意:
代码末尾可能有一些东西需要在 GL 线程上执行(有时)。在这种情况下,您可以使用

Gdx.app.postRunnable(new Runnable() {
    @Override
    public void run() {
        // your code
    }
});

【讨论】:

  • 好的,所以我尝试了这个 .. 在我的 onTouchRate 方法中 .. new Thread(new Runnable(){ @Override public void run() { try { Thread.sleep(50); } catch ( InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } startActivity(Intent.createChooser(sharingIntent, "Share via")); } }).start(); ...如果我没有使用延迟..那么问题仍然存在,而如果我使用小延迟,那么也会看到问题,但延迟为 50,我想足够大,问题已解决。你能解释一下这个原因吗?
  • 发送意图是一个缓慢而繁重的过程,如果不仔细编写,可能会影响其他事物(如您的案例中的按钮)的性能。 50 的阈值在不同的设备上可能会有所不同,所以最好不要依赖它。我建议你使用 scene2d。它非常易于使用且功能强大。
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2016-12-05
相关资源
最近更新 更多