2016-08-12 3 views
2

Ich verwende eine MediaController, um die Videowiedergabe für meine VideoView zu steuern. Ich habe VideoView.setOnPreparedListener überschrieben, so dass die ActionBar/Toolbar ausgeblendet ist (hide()), nachdem das Video zuerst Pufferung beendet. Und ich möchte die Symbolleiste auf Comeback, wenn die MediaController tut. Ich habe versucht, überwiegende die MediaControllershow() und hide() Methoden, etwa so:Ausblenden und Anzeigen der Symbolleiste auf MediaController show() und hide()

mVideoView.start(); 
    // Media Controller 
    mMediaController = new MediaController(this){ 
     @Override 
     public void show() { 
      getSupportActionBar().show(); 
     } 
     @Override 
     public void hide() { 
      getSupportActionBar().hide(); 
     } 
    }; 
    mMediaController.setAnchorView(mVideoView); 
    mVideoView.setMediaController(mMediaController); 
    // Hide toolbar once video starts 
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      // Hide support bar 
      getSupportActionBar().hide(); 
     } 
    }); 

Dies funktioniert, mit Ausnahme der Steuerelemente für die Wiedergabe zeigt bis zu stoppen! Und natürlich funktioniert das rekursive mMediaController.show() innerhalb der überschriebenen Methode nicht ... Kann ich meinen Kuchen auch essen?

bearbeiten

So habe auch ich versuchte, unsucessfully Vorteil der VideoView.setOnTouchListener und VideoView.setOnCompletetionListener unter:

mVideoView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      getSupportActionBar().show(); 
      return false; 
     } 
    }); 
    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      getSupportActionBar().hide(); 
     } 
    }); 

Es zeigt, aber es wird nicht wieder verstecken, vielleicht falsch interpretieren ich OnCompletetionListener ?

Edit 2 Von Amir Vorschlag überschreiben ich die onTouch für VideoView, nicht perfekt, aber es ist auf wie dem richtigen Weg:

mMediaController = new MediaController(this); 
    mVideoView = (VideoView) findViewById(R.id.media_player); 
    mVideoView.setOnTouchListener(new View.OnTouchListener() { 
     boolean flag; 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        if(flag) { 
         mMediaController.hide(); 
         getSupportActionBar().hide(); 
        } else { 
         mMediaController.show(); 
         getSupportActionBar().show(); 
        } 
        flag = !flag; 
        return true; 
      } 
      return false; 
     } 
    }); 

Diese meist funktioniert, schaltet es die Toolbar und so manchmal erscheint die Toolbar ohne die MediaController, und jedes Mal, wenn ich es umschalte, erscheint die MediaController es regelmäßig 'für ein paar Sekunden erscheinen und dann verschwinden.' In jedem Fall ist es eine funktionierende Lösung.

Antwort

2

Sie sollten Ihre OnTouchListener ein bisschen ändern. Ich folgende in meinem Projekt und funktioniert gut:

final MediaController mediaController = new MediaController(this); 
     VideoView videoView = (VideoView) findViewById(R.id.videoView); 
     videoView.setOnTouchListener(new View.OnTouchListener() { 
      boolean flag = true; 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       switch (motionEvent.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         if (flag) { 
          mediaController.hide(); 
          hideToolbar(); 
         } 
         else { 
          mediaController.show(0); 
          showToolbar(); 
         } 
         flag = !flag; 
         return true; 

       } 

       return false; 
      } 
     }); 

     videoView.setMediaController(mediaController); 
     videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mediaPlayer) { 

      } 
     }); 
     videoView.setVideoURI(Uri.parse("http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4")); 

Und HideToolbar() mit einigen traslate Animation:

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start(); 

Showtoolbar():

toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start(); 

Auch wenn Sie müssen HideStatusBar Anruf setUiFlag() with true:

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
private void setUiFlags(boolean fullscreen) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     View decorView = getWindow().getDecorView(); 
     if (decorView != null) { 
      decorView.setSystemUiVisibility(fullscreen ? getFullscreenUiFlags() : View.SYSTEM_UI_FLAG_VISIBLE); 
     } 
    } 
} 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
private int getFullscreenUiFlags() { 
    int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_FULLSCREEN; 
    } 

    return flags; 
} 
+0

Also habe ich das versucht, und es hat nicht funktioniert. Ich habe versucht, den MediaController an mehreren Stellen zu deklarieren, einschließlich vor der onCreate-Methode (um 'final' zu erklären - aber wenn ich das tue, stürzt die App ab, weil sie den Kontext nicht finden kann. Ist das mein Problem? – Nevermore

+0

@Nevermore ist es nicht in Bezug auf den endgültigen Wert: Welcher Teil des Codes verursacht eine Ausnahme?Ich habe diesen Code vor zwei Stunden getestet und funktioniert. – Amir

+0

@Nevermore auch manchmal ** setMediaController ** Ursache Ausnahme setzen Sie es in Versuch fangen. Legen Sie auch Internet-Berechtigung in Manifest fest. – Amir

1

Ihr ursprünglicher Code scheint zu funktionieren, wenn Sie Aufrufe zu den entsprechenden Supermethoden hinzufügen.

mediaController = new MediaController(this){ 
    @Override 
    public void show() { 
     super.show(); 
     getSupportActionBar().show(); 
     Toast.makeText(activity_media_player.this, "SHOW TOOLBAR", Toast.LENGTH_SHORT).show(); 
    } 
    @Override 
    public void hide() { 
     super.hide(); 
     getSupportActionBar().hide(); 
     Toast.makeText(activity_media_player.this, "HIDE TOOLBAR", Toast.LENGTH_SHORT).show(); 
    } 
};