libgdx按钮图像动画启动新活动时的奇怪行为

时间:2014-04-04 02:16:14

标签: android animation button android-activity libgdx

我没有使用libgdx lib来创建按钮和菜单,而是编写了我自己的代码。

但是现在我在动画按钮中遇到了一个非常奇怪的问题。

我为按钮实现了非常简单的动画。如果触摸了按钮(即触摸了触摸屏,但未触发)我将按钮图像移动到x = 1px右边,y = 1px向下。当触摸屏被释放时,按钮图像被重置为其原始位置,即x = 1px左,y = 1px up;

以下是我实现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. 有时动画完成,即图像移动,然后返回到正常位置,但随后会调用一到两个渲染帧,这将显示按钮图像到移位位置(添加了偏移量,我已将其设置为0 ,当我发布触摸!!!)即使我在setTouchStopAnimation()中将offset变量设置为0。然后它会按预期加载新活动,然后一旦活动结束并恢复游戏活动,按钮图像就会移到原始位置。

  3. 有时动画片根本没有被看到。(这可能是因为,事情处理得太快,因为我没有使用任何延迟!!)..现在没问题!......或任何其他原因是什么?

  4. 问题只出现在监听器启动新活动的按钮上!

    我应该最好使用libgdx lib来获取菜单和按钮以避免这种行为。

    由于 vipul

1 个答案:

答案 0 :(得分: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
    }
});