2017-07-09 1 views
13

Utilisé ViewPager pour les images glissantes, chaque image surclic diffère MP3 différents.Mediaplayer répondre à un deuxième clic pour faire une pause

application dont 50 pages (images) & 50 mp3 différents, tous les mp3 stockés sur l'application elle-même.

ex. Flux de première page MP3 (un), deuxième page MP3 (deux) et ainsi de suite jusqu'à la page cinquante.

PREMIER:

son beau travail juste une seule question qui est:

In any page --> clicking the image --> 

PLAY MP3(one) --> click again--> PAUSE MP3 --> 
in paused state of MP3(one) SWIPE to next page --> 

--> in next page --> clicking the image --> 
    PLAY MP3(two) --> click to pause the MP3(two) 

    --> it doesn't respond to first click,it respond to second click to pause MP3(two). 

DEUXIÈME:

l'application contient 50 pages et 50 MP3 différents, ne j'ai besoin pour répéter le code mediaplayer 50 fois que j'ai déjà fait, ou il y a une meilleure approche pour faire cela en code unique appliqué à tous les 50 mediaplayer MP3, comme tout a la même fonction cycle.

des conseils s'il vous plaît et comment l'appliquer dans le codage.

MainActivity:

public class MainActivity extends Activity { 

private ViewPager mViewPager; 
MediaPlayer mp; 
private boolean isPaused; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mViewPager= (ViewPager) findViewById(R.id.view_pager); 
    ImageAdapter adapter = new ImageAdapter(this); 
    mViewPager.setAdapter(adapter); 

    final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener()); 
    mViewPager.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      tapGestureDetector.onTouchEvent(event); 
      return false; 
     } 
    }); 
} 

private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     if (mViewPager.getCurrentItem() == 0) { 
      if (mp != null) { 
       if (isPaused) { 
        mp.start(); 
        isPaused = false; 
       } else { 
        mp.pause(); 
        isPaused = true; 
       } 
      } else { 
       mp = MediaPlayer.create(MainActivity.this, R.raw.aa); 
       mp.start(); 

        } 
       } 

     if (mViewPager.getCurrentItem() == 1) { 
      if (mp != null) { 
       if (isPaused) { 
        mp.start(); 
        isPaused = false; 
       } else { 
        mp.pause(); 
        isPaused = true; 
       } 
      } else { 
       mp = MediaPlayer.create(MainActivity.this, R.raw.bb); 
       mp.start();     
      } 
     } 

     if (mViewPager.getCurrentItem() == 2) { 
      if (mp != null) { 
       if (isPaused) { 
        mp.start(); 
        isPaused = false; 
       } else { 
        mp.pause(); 
        isPaused = true; 
       } 
      } else { 
       mp = MediaPlayer.create(MainActivity.this, R.raw.cc); 
       mp.start();     
      } 
     } 

     if (mViewPager.getCurrentItem() == 3) { 
      if (mp != null) { 
       if (isPaused) { 
        mp.start(); 
        isPaused = false; 
       } else { 
        mp.pause(); 
        isPaused = true; 
       } 
      } else { 
       mp = MediaPlayer.create(MainActivity.this, R.raw.dd); 
       mp.start(); 
      } 
     } 
     //AND SO ON FOR 50 PAGES// 
     mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if (mp == null) { 
        return; 
       } 
       mp.release(); 
       mp = null; 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
       // TODO Auto-generated method stub     
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
       // TODO Auto-generated method stub 
      } 
     }); 

     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer m) { 
       Toast.makeText(MainActivity.this, 
         "COMPLETED", Toast.LENGTH_LONG).show(); 
       // Set the MainActivity member to null 
       MainActivity.this.mp = null; 
      } 
     }); 

     return super.onSingleTapConfirmed(e); 
     } 
    } 
} 

ImageAdapter:

public class ImageAdapter extends PagerAdapter { 
Context context; 
private int[] GalImages = new int[] { 
    R.drawable.a, 
    R.drawable.b, 
    R.drawable.c, 
    R.drawable.d, 

}; 
ImageAdapter(Context context){ 
    this.context=context; 
} 
@Override 
public int getCount() { 
    return GalImages.length; 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == ((ImageView) object); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    ImageView imageView = new ImageView(context); 
    int padding = context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin); 
    imageView.setPadding(padding, padding, padding, padding); 
    imageView.setScaleType(ImageView.ScaleType.CENTER); 
    imageView.setImageResource(GalImages[position]); 
    ((ViewPager) container).addView(imageView, 0); 
    return imageView; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    ((ViewPager) container).removeView((ImageView) object); 
    } 
} 

Je suis nouveau android, j'ai essayé de le réparer, mais sans succès, son application simple comprend juste MainActivity & ImageAdapter.

i essayé le code ci-dessous également toujours le problème pas résolu:

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if (mp != null) { 
        if (mp.isPlaying()) { 
         mp.stop(); 
        } 
        mp.release(); 
        mp = null; 
       } 
      } 
      @Override 
      public void onPageScrollStateChanged(int arg0) { 
       // TODO Auto-generated method stub     
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
       // TODO Auto-generated method stub 
      } 
     }); 

MISE À JOUR:

Dans une page:

disons la page (un) ---> cliquez pour lire MP3 ---> (lecture) ---> cliquer pour faire une pause MP3 ---> (pause) ---> glisser vers n'importe quelle page Rt ou Lf ---> (glissé sur la page (deux) par exemple) ---> clique ici pour jouer MP3 sur la page (deux) ---> (joue) ---> clique pour mettre en pause MP3 sur la page (deux) ---> (pause) - -> (toutes les actions onclick précédentes fonctionnent correctement) ---> cliquer pour reprendre la lecture MP3 dans la page (deux) qui est déjà en état de pause ====> MAIS par erreur lorsque vous cliquez sur l'image de la page (deux) pour reprendre la lecture du MP3, votre doigt pas droit, son légèrement incliné de sorte que le doigt cliquez sur conduire à (cliquez sur la page (deux) et dans le même temps glisser vers la page (trois) ====> voici le numéro de la page (trois) MP3 commence à jouer par lui-même depuis le début.

Je souhaite que cela se produise occasionnellement ou par erreur pour ne pas commencer à lire le MP3 en page (trois) jusqu'à ce que je clique sur l'image de la page (trois) puis commence à lire le MP3.

toute aide sera vraiment appréciée.

Répondre

0

Questions première réponse: -

Il suffit de copier coller ce code et laissez-moi savoir je n'ai pas testé, mais ont un fort sentiment que cela va fonctionner.

import java.lang.reflect.Field; 
    public class MainActivity extends Activity { 

     private ViewPager mViewPager; 
     MediaPlayer mp; 
     private boolean isPaused; 
     private ArrayList<Integer> mMp3s; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      mViewPager = (ViewPager) findViewById(R.id.view_pager); 
      ImageAdapter adapter = new ImageAdapter(this); 
      mMp3s=getAllMp3FilesFromRaw(); 
      mViewPager.setAdapter(adapter); 

      final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener()); 
      mViewPager.setOnTouchListener(new View.OnTouchListener() { 
       public boolean onTouch(View v, MotionEvent event) { 
        tapGestureDetector.onTouchEvent(event); 
        return false; 
       } 
      }); 
     } 

     private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { 
      @Override 
      public boolean onSingleTapConfirmed(MotionEvent e) { 

        if (mp != null) { 
         if (isPaused) { 
          mp.start(); 
          isPaused = false; 
         } else { 
          mp.pause(); 
          isPaused = true; 
         } 
        } else { 
         mp = MediaPlayer.create(MainActivity.this, mMp3s.get(mViewPager.getCurrentItem())); 
         mp.start(); 
         isPaused = false; 
        } 


       //AND SO ON FOR 50 PAGES// 
       mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         if (mp == null) { 
          return; 
         } 
         mp.release(); 
         mp = null; 
         isPaused = true; 
        } 

        @Override 
        public void onPageScrollStateChanged(int arg0) { 
         // TODO Auto-generated method stub 
        } 

        @Override 
        public void onPageScrolled(int arg0, float arg1, int arg2) { 
         // TODO Auto-generated method stub 
        } 
       }); 

       mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        public void onCompletion(MediaPlayer m) { 
         Toast.makeText(MainActivity.this, "COMPLETED", Toast.LENGTH_LONG).show(); 
         // Set the MainActivity member to null 
         finish(); 
         MainActivity.this.mp = null; 
        } 
       }); 

       return super.onSingleTapConfirmed(e); 
      } 
     } 

     /** 
     *Do it on background thread if it blocks the UI. 
     */ 
     private ArrayList<Integer> getAllMp3FilesFromRaw() { 
      ArrayList<Integer> mp3s = new ArrayList<>(); 
      try { 
       Field fields[] = R.raw.class.getDeclaredFields(); 
       for (int i = 0; i < fields.length; i++) { 
        Field f = fields[i]; 

        int resIdentifier = getResources().getIdentifier(f.getName(), "raw", getPackageName()); 
        mp3s.add(resIdentifier); 
       } 
       return mp3s; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
    } 

La logique est d'obtenir tous les id fichiers mp3 de ressources lorsque vous démarrez l'application si ce processus prend trop de temps le faire sur un fil d'arrière-plan. En utilisant ces resorce id jouer vos chansons maintenant il y a beaucoup de problème avec la liste que vous chercher comme ils peuvent ne pas correspondre avec votre image ou votre numéro de viewpager pour que vous devrez appliquer une autre logique si vous rencontrez une erreur laisser moi sais.

Questions Sec répondent: - Maintenant, je présume que lorsque vous voulez cliquer sur l'image pour jouer la musique en même temps par page erreur est se glissée et quand il a atteint à autre page, il commence à jouer de cette page musique immédiatement. Si j'ai bien compris votre question car je ne sais toujours pas quel code utilisez-vous, je vous guiderai à travers les méthodes basées sur ce que vous pouvez appliquer la logique.

lorsque des modifications à la page suivante puis

onPageChanged(int position) 
méthode

seront appelés https://stackoverflow.com/a/11294494/5492047 ici vous pouvez appliquer la logique. Maintenant, comment, si la musique joue et vous êtes sur la première page et vous glissée sur la seconde ce que vous avez à faire

onPageChanged(int position) 
    { 
    mp.release(); 
    mp=null; 
    //Now initialiase it again with page two's music. 
    mp = MediaPlayer.create(MainActivity.this, R.raw.aa); 
    } 

et ne pas appeler mp.start(); maintenant lorsque l'utilisateur clique sur l'image dans

OnClickListener(View view){ 
    //use the same instance of mediaplayer and call mp.start(); 
    if(isPlaying){ 
     mp.pause(); 
    }else{ 
    mp.start(); 
} 
} 

Je suppose que vous utilisez une seule instance de MediaPlayer pas comme vous l'avez indiqué dans votre code.

+0

s'il vous plaît j'ai petit problème, si vous avez un conseil, dans n'importe quelle page ---> cliquez pour jouer ---> cliquez pour pause - -> balayez vers n'importe quelle page Rt ou Lf ---> cliquez ici pour jouer ---> cliquez pour mettre en pause ---> (fonctionne correctement) ---> cliquez pour résumer mais balayez par erreur vers la page suivante ---> commencer immédiatement la page MP3 immédiatement sans cliquer dessus, Je veux même si mon doigt clique mène accidentellement à une autre page pour commencer à cliquer pas par lui-même. – frozenhill4

+0

ok si cette réponse vous a aidé s'il vous plaît l'accepter et attribuer la prime et votre deuxième question n'est pas claire. Comme lorsque vous balayez vers la page suivante ou précédente si vous devez lire le mp3 immédiatement ou il devrait jouer après avoir balayer sur la page et en cliquant dessus? –

+1

@ReyanshMishra s'il vous plaît ne pas imposer votre réponse sur OP & force pour vous envoyer prime, S'il a des doutes les effacer. Si le problème est résolu, il acceptera sûrement et vous fournira la prime. – Gattsu

0

PREMIER Je crois que votre isPaused reste fidèle après une pause de la première chanson, vous devrez peut-être il est défini sur false lorsque les pages de changement d'utilisateur:

public void onPageSelected(int position) { 
      if (mp == null) { 
       return; 
      } 
      mp.release(); 
      mp = null; 
      isPaused = false; 
     } 

DEUXIÈME Vous pouvez utiliser un List<Integer> que vous pouvez initialiser au début de votre application, de sorte que vous pouvez avoir une structure pour stocker vos chansons, car c'est la seule chose qui change dans votre code, exemple:

List<Integer> songs; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
... 
    songs = new ArrayList<>(); 
    songs.add(R.raw.aa); 
    songs.add(R.raw.bb); 
//...etc 
} 

Et puis sur votre méthode onSingleTapConfirmed vous pouvez simplement y accéder par index juste une fois:

 if (mp != null) { 
      if (isPaused) { 
       mp.start(); 
       isPaused = false; 
      } else { 
       mp.pause(); 
       isPaused = true; 
      } 
     } else { 
      mp = MediaPlayer.create(MainActivity.this, 
        songs.get(mViewPager.getCurrentItem())); 
      mp.start(); 
      isPaused = false; 
     } 
+0

vérifiez la mise à jour s'il vous plaît, merci. – frozenhill4

+0

J'ai modifié ma réponse que j'ai –

+0

s'il vous plaît petite question, si vous avez des conseils, sur une page ---> cliquez pour jouer ---> cliquez pour mettre en pause ---> swipe à une page Rt ou Lf - -> cliquez pour jouer ---> cliquez pour faire une pause ---> (fonctionne correctement) ---> cliquez pour continuer mais par erreur balayez vers la page suivante ---> page suivante MP3 jouera immédiatement sans cliquer dessus, je veux même si mon doigt clique mène à balayer par erreur à une autre page MP doit jouer en réponse à cliquer pas par lui-même. – frozenhill4

0

Selon votre description et ma compréhension, j'énumère les demandes que vous voulez que le programme fasse. Une fois que vous cliquez sur l'image ou que vous changez de page, MediaPlayer répond comme les règles ci-dessous.

RÈGLES:

  1. Si aucune chanson jouée avant, vous cliquez, lecteur commence la lecture du morceau de la page en cours.

  2. Si une chanson jouée avant et le joueur continue à jouer, vous cliquez sur, le lecteur PAUSE.

  3. Si une chanson a déjà été jouée et que le lecteur est encore en train de jouer, vous permutez, le lecteur se relâchera avant de commencer à jouer la chanson de la page en cours. Si une chanson a été jouée avant et que le lecteur est en pause, vous CLIQUEZ, si la page en cours N'EST PAS la page de la chanson mise en pause avant, le joueur se relâchera avant de commencer la chanson de la page en cours.

  4. Si une chanson a été jouée avant et que le lecteur est en pause, vous CLIQUEZ, si la page en cours EST la page de la chanson mise en pause avant, le lecteur continuera à jouer.

  5. Si une chanson jouée avant et lecteur est en pause, vous parvenez, rien ne se passe.

mots de lecture est incompréhensible, s'il vous plaît vérifier l'image ci-dessous: (règle 1 est en fait la même chose que la règle 4.) rules

S'il n'y a pas de malentendu, je vais commencer à répondre à la question. Ou s'il vous plaît faites le moi savoir.

Maintenant, nous faisons clairement sur la façon dont la réponse du joueur lorsque vous cliquez ou changez de page dans la situation différente (si la page actuelle est la page de la chanson en pause avant).

Soit on parle de la façon d'éviter le code redoublée. Comme d'autres réponses dit, utilisez la liste des chansons et utilisez l'index (num de la page) pour distinguer chacun d'entre eux.

Ainsi les sont déclarés comme ça:

List<Integer> mMP3s = new ArrayList<Integer>() { 
    { 
     add(R.raw.mp3_0); 
     add(R.raw.mp3_1); 
     add(R.raw.mp3_2); 
     add(R.raw.mp3_3); 
     add(R.raw.mp3_4); 
     //... 
     //AND SO ON FOR 50 PAGES// 
    } 
}; 

Et lorsque vous cliquez sur l'image (régler la OnClickListener sur l'image):

@Override 
public void onClick(View view) { 
    int position = mViewPager.getCurrentItem(); 
    if (mp != null) { 
     if (isPaused) { 
      if (pausedPage == position) { 
       mp.start(); 
      } else { 
       mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); 
       mp.start(); 
      } 
      isPaused = false; 
     } else { 
      mp.pause(); 
      isPaused = true; 
      pausedPage = position; 
     } 
    } else { 
     mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); 
     mp.start(); 
     isPaused = false; 
    } 
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer m) { 
      Toast.makeText(MainActivity.this, 
        "COMPLETED", Toast.LENGTH_LONG).show(); 
      // Set the MainActivity member to null 
      MainActivity.this.mp = null; 
     } 
    }); 
} 

Et quand vous changez de pages:

@Override 
public void onPageSelected(int position) { 
    if (!isPaused) { 
     mp.release(); 
     mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); 
     mp.start(); 
     tv.append("START page" + position + "\n"); 
    } else { 
     //do nothing. 
    } 
} 

Si vous êtes encore perplexe au sujet du code, s'il vous plaît voir here. J'ai téléchargé mon code sur github.

+0

veuillez s'il vous plaît vérifier la mise à jour sur la question, merci – frozenhill4

+0

Je peux mal comprendre votre question. Mais je pense que votre logique n'est pas confortable pour l'utilisateur à utiliser. Imaginez une scène comme celle-ci, My Heart Will Go On joue, je fais une pause et balayez les pages pour chercher s'il y a d'autres chansons qui m'intéressent, après une période de recherche, je décide de retourner la page de My Heart Will Go On et cliquez dessus pour continuer à jouer. Est-ce mieux? –

+0

Dans votre logique, mon cœur va commencer à jouer à partir du début de cette chanson plutôt que de continuer à jouer. Et pendant ma recherche, MediaPlayer sera instancié plusieurs fois (autant que le nombre de pages que j'ai glissé). Ne pensez-vous pas que c'est une consommation inutile pour la mémoire? –