تشغيل صوت حلقة عند الضغط على الزر في Android
-
29-09-2019 - |
سؤال
مشكلتي بسيطة. أريد تشغيل صوت حلقة فقط عند الضغط على زر. فيما يلي عبارة التبديل ، وإذا اقتربت أخرى من جربتها. في أحسن الأحوال ، يمكنني تشغيل الصوت ولكنه لن يتوقف عندما لم يعد الزر يتم الضغط عليه.
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();
}