2011-11-04 3 views
0

내가 복용하는 코스에 보드 게임을 구현하고 있습니다. 5 명의 "랙"(ImageViews)이 있으며, 5 명의 플레이어 각각에 대해 1입니다. 현재 플레이어에게 보여주고 싶은 방식은 랙을 "강조 표시"(알파 값 설정을 통해 달성)하는 것입니다. 자, setAlpha 메소드를 호출하여 성공적으로 수행 할 수 있습니다.하지만 알파 애니메이션을 사용하고 싶습니다. 내 문제는 현재 플레이어가 전환 할 때 강조 표시된 랙을 희미하게 표시하고 다음 랙을 강조 표시하는 것입니다. 이 두 개의 랙을 사용하면이 정도의 작업을 수행 할 수 있지만, 모든 기타 랙은 즉각 밝아지고 천천히 어두워 지므로 "희미한"작업을 수행합니다. 게임을 다소 기괴하게 보입니다. 그래서 내가 바꾸고 싶은 두 가지는 바르게 바뀌고 있지만, 나머지는 모두 어렴풋이 있어야합니다. 나는 다음과 같은 코드는에 설정 한 :

dim.xml :ImageView 대신 모든 ImageView를 애니메이션으로 처리하는 Android 알파 애니메이션

<?xml version="1.0" encoding="utf-8"?> 
<alpha 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromAlpha="0.75" 
    android:toAlpha="0.5" 
    android:duration="1000"/> 


highlight.xml :

<?xml version="1.0" encoding="utf-8"?> 
<alpha 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromAlpha="0.5" 
    android:toAlpha="0.75" 
    android:duration="1000"/> 


어두운 강조 표시 방법 :

dim = AnimationUtils.loadAnimation(gui, R.anim.dim); dim.setFillAfter(true); 
highlight = AnimationUtils.loadAnimation(gui, R.anim.highlight); highlight.setFillAfter(true); 

public Runnable dim(final Player player) { 
    return new Runnable() { 
      public void run() { 
       dim.reset(); 
       player.getRack().clearAnimation(); 
       player.getRack().startAnimation(dim); 
       //player.getRack().setAlpha(128); 
       continuation(); 
      } 
     }; 
} 

public Runnable highlight(final Player player) { 
    return new Runnable() { 
      public void run() { 
       highlight.reset(); 
       player.getRack().clearAnimation(); 
       player.getRack().startAnimation(highlight); 
       //player.getRack().setAlpha(192); 
       continuation(); 
      } 
     }; 
} 

호출 된 장소 (별표로 표시) :

public void setup() { 
    int starting = (int)(Math.random()*players.size()); 
    curPlayer = players.get(starting); 
    observer.execute(
    *** observer.dim(players.get(0)), 
    *** observer.dim(players.get(1)), 
    *** observer.dim(players.get(2)), 
    *** observer.dim(players.get(3)), 
    *** observer.dim(players.get(4)), 
    *** observer.highlight(curPlayer) 
    ); 
} 

public void draw() { 
    if(deck.isEmpty()) { 
     //Game over 
     return; 
    } 
    Question q = deck.pop(); 
    String answer = q.answer(curPlayer); 
    answers.add(answer); 
    Player oldPlayer = curPlayer; 
    curPlayer = players.get((curPlayer.getPlayerNum() + 1)%players.size()); 
    observer.execute(
     observer.ask(q.getQuestionText()), 
     observer.say(answer), 
    *** observer.dim(oldPlayer), 
    *** observer.highlight(curPlayer) 
    ); 
} 


어떤 아이디어 ??? 나는 이것으로 벽을 치고있어 어디서나 대답을 찾을 수없는 것 같습니다. 많은 양의 코드를 유감스럽게 생각합니다!

답변

0

저는 사용중인 옵서버 클래스에 익숙하지 않습니다. 2 가지를 시도하십시오 :

1) 각 흐리게/강조 표시 호출시 애니메이션을 다시로드하십시오. 2) 무승부에서 관찰자없이 시도하십시오 (명시 적으로 startAnimation 호출).

저는 관찰자 등급이 진행되고있는 것으로 가정하고 있으며, # 2는 차이를 만들지는 않을 것입니다. UI 스레드에서 이러한 작업을 호출 할 수 있도록 observer를 사용하는 경우 Handler를 만들거나 사용하십시오.

+0

애니메이션을 다시로드하면 매력처럼 작동합니다. 고마워! 어떤 생각이라도 그래도? 다소 이상하게 보입니다 – user1028885

+0

잘 모르겠군요. 애니메이션은 타겟 목록을 내부적으로 유지하고 업데이트하도록 지시 할 수 있습니까? 나는 짐작하고있다. 안드로이드 소스 (당신이 할 수있는, 나는 가지고있다.) –

관련 문제