سؤال

مشكلتي بسيطة. أريد تشغيل صوت حلقة فقط عند الضغط على زر. فيما يلي عبارة التبديل ، وإذا اقتربت أخرى من جربتها. في أحسن الأحوال ، يمكنني تشغيل الصوت ولكنه لن يتوقف عندما لم يعد الزر يتم الضغط عليه.

    public boolean onTouch(View v, MotionEvent event) {
 MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.clash);

 if (v.getId() == R.id.clash && event.getAction() == MotionEvent.ACTION_DOWN){
  mp.setLooping(true);
  mp.start();

 }else if (v.getId() == R.id.clash && event.getAction() == MotionEvent.ACTION_UP)
 {mp.pause();

 }
}

    public boolean onTouch(View v, MotionEvent event) {
    MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.clash);

     switch (event.getAction()){

     case MotionEvent.ACTION_DOWN:
      mp.setLooping(true);
      mp.start();

     case MotionEvent.ACTION_UP:
      mp.pause();
    }


    return false;
   }
هل كانت مفيدة؟

المحلول

حاول العودة true بدلاً من false في نهاية onTouch.

ما يحدث (ربما) الآن هو أن تحصل على ACTION_DOWN الحدث الذي يبدأ صوتك. عن طريق العودة false أنت تخبر الإطار الذي أنت لم استهلك الإجراء ، الذي يتطلبه الأمر ليعني أنك لن تستهلك الإجراءات المستقبلية أيضًا. وبالتالي ، سوف يتوقف عن إرسال أحداث اللمس إلى وجهة نظرك.

اقتباس ذات صلة من أندرويد-المطورين:

عندما تحصل على حدث Action_down ، هل تعود صحيحًا؟ إذا لم يكن الأمر كذلك ، فربما تكون هذه هي القضية. سيقدم الإطار فقط أحداث اللمس المستقبلية (Action_moves و Action_UP) إلى هذا العرض إذا كان المستمع الذي يعمل باللمس أو OnTouchevent يعود صحيحًا.

نصائح أخرى

حرك النائب الخاص بك خارج معالج Ontouch!

MediaPlayer mp;
public boolean onTouch(View v, MotionEvent event) {
mp = MediaPlayer.create(getBaseContext(), R.raw.clash);

 switch (event.getAction()){

 case MotionEvent.ACTION_DOWN:
  mp.setLooping(true);
  mp.start();

 case MotionEvent.ACTION_UP:
  mp.pause();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top