2016-12-16 6 views
0

У меня этот очень простой кодовый цикл, Я не делаю никаких осложнений! TextAnimation() метод получить вызов, но, анимация внутри него не начинается (я не могу видеть Log)Анимация не работает в SurfaceView

это мой треск:

моей активность Главное:

public class Main extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
} 

мой макет главной:

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/lineralayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#fff"> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <gamedevelopment.mahdi.nazari.killthemall_training.GameView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

<LinearLayout 
    android:id="@+id/Li_ly" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/level_text" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_marginTop="0dp" 
     android:background="#fff" 
     android:gravity="center" 
     android:text="fdfdsf" 
     android:textColor="#000" 
     android:textSize="60dp" /> 
</LinearLayout> 

мой Gameview:

public class GameView extends SurfaceView { 

TextView level_text; 
LinearLayout ly; 

public GameView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    start(); 
} 

public GameView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    start(); 
} 

public void start() { 
    surfaceHolder = getHolder(); 
    surfaceHolder.addCallback(new SurfaceHolder.Callback() { 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 

      LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View v = inflater.inflate(R.layout.main, null); 
      level_text = (TextView) v.findViewById(R.id.level_text); 
      ly = (LinearLayout) v.findViewById(R.id.Li_ly); 

      TextAnimation(); 

     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      firstCreacation = false; 
      gameLoopThread.setRunning(false); 
     } 
    }); 
} 


public void TextAnimation() { 

    Animation animation = AnimationUtils.loadAnimation(context, R.text_anim); 
    animation.setAnimationListener(new Animation.AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation animation) { 
      Log.e("start",""); 
     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      ShowLevelText2(); 
      Log.e("End",""); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }); 

    level_text.startAnimation(animation); 
} 

} 

Может кто-нибудь мне помочь? Что не так с этим кодом? Спасибо :)

ответ

0

На самом деле, вы делаете все это неправильно. SurfaceView не должен работать с обычной системой View, по крайней мере, не ниже Nougat. Помимо этого, вы на самом деле не ссылаетесь на уже завышенную иерархию представлений, вы раздуваете новую иерархию представлений, которая нигде не отображается, и вы пытаетесь ее оживить, она может быть анимирована, но вы не можете ее увидеть, потому что она не показан на экране. Чтобы эта анимация работала, вам необходимо передать ссылку TextView из Activity в SurfaceView, из конструктора или с помощью методов setter, а затем анимировать ссылку TextView. Или лучше, чтобы иметь обратный вызов от surfaceCreated к Activity и воспроизвести анимацию внутри Activity. Код может выглядеть примерно как этот

public class Main extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView textView = findViewById(R.id.level_text); 
     GameView gameView = findViewById(R.id.game_view); //Give an id to your GameView, I'm just using a random id here 

     gameView.setTextView(textView); 
    } 
} 

Сейчас внутри Gameview

public class GameView extends SurfaceView { 
    TextView textView; 

    ... // All your code 

    public void setTextView(TextView t){ 
     textView = t; 
    } 

    public void TextAnimation(){ 
     ... // All your code 

     textView.startAnimation(animation) 
    } 
} 
+0

Спасибо за ваш ответ, и да, я нашел мою проблему yesterday.As вы сказали, я надуть и получить другую ссылку взглядов, не который показан на экране. – MehDi

+0

@MehDi поэтому отмечайте ответ как принятый, если я прав, поэтому он может быть полезен другим людям. –

+0

Но как я могу получить такую ​​же ссылку с помощью просмотра надувания? Мы раздуваем viw, чтобы что-то сделать в коде! Есть ли способ получить такую ​​же ссылку путем раздувания, а не запускать ее в Activity и передавать ссылки установщиком? – MehDi

 Смежные вопросы

  • Нет связанных вопросов^_^