Действие при зажатии кнопки

Всем привет, нужна помощь! Есть код

содержимое MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity {
    ImageButton button_supplysystem;
    private long down;

    public void sound_hack(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.sound_hack);
        mediaPlayer.start();
    }
    public void sound_hacklight(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.light);
        mediaPlayer.start();
    }
    public void sound_hackblocker(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.blocker);
        mediaPlayer.start();
    }
    public void sound_cellphone(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.cellphone);
        mediaPlayer.start();
    }
    public void sound_hacktrain(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.train);
        mediaPlayer.start();
    }
    public void sound_door(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.door);
        mediaPlayer.start();
    }
    public void sound_transformer(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.transformer);
        mediaPlayer.start();
    }
    public void sound_electric_shield(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.electric_shield);
        mediaPlayer.start();
    }
    public void sound_camera(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.camera);
        mediaPlayer.start();
    }
    public void sound_pipes(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.pipes);
        mediaPlayer.start();
    }
    public void sound_thorns(View view){
        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.thorns);
        mediaPlayer.start();
    }
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button_supplysystem = (ImageButton) findViewById(R.id.button_supplysystem);



    button_supplysystem = (ImageButton) findViewById(R.id.button_supplysystem);
        button_supplysystem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intentLoadNewActivity = new Intent(MainActivity.this, supply_system.class);
            startActivity(intentLoadNewActivity);
        }

    });
}
}

Содержимое activity main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context=".MainActivity">

    <ImageButton
        android:id="@+id/button_supplysystem"
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="30dp"
        android:layout_marginRight="247dp"
        android:onClick="sound_hack"
        android:scaleType="center"
        android:src="@drawable/loader"/>

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="149dp"
        android:layout_marginRight="249dp"
        android:onClick="sound_hacklight"
        android:scaleType="center"
        android:src="@drawable/light" />

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="28dp"
        android:layout_marginRight="5dp"
        android:onClick="sound_hacktrain"
        android:scaleType="center"
        android:src="@drawable/train" />

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="149dp"
        android:layout_marginRight="5dp"
        android:onClick="sound_door"
        android:scaleType="center"
        android:src="@drawable/gateway" />

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="149dp"
        android:layout_marginRight="124dp"
        android:onClick="sound_transformer"
        android:scaleType="center"
        android:src="@drawable/transformer" />

    <ImageButton
        android:id="@+id/button_thorns"
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="261dp"
        android:layout_marginRight="5dp"
        android:onClick="sound_thorns"
        android:scaleType="center"
        android:src="@drawable/thorns" />

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="376dp"
        android:layout_marginRight="249dp"
        android:onClick="sound_hackblocker"
        android:scaleType="center"
        android:src="@drawable/blocker" />

    <ImageButton
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="261dp"
        android:layout_marginRight="249dp"
        android:onClick="sound_pipes"
        android:scaleType="center"
        android:src="@drawable/pipes" />

    <ImageButton
        android:id="@+id/playButton1"
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="30dp"
        android:layout_marginRight="124dp"
        android:onClick="sound_camera"
        android:scaleType="center"
        android:src="@drawable/camera" />

    <ImageButton
        android:id="@+id/ID_electric_shield"
        android:layout_width="109dp"
        android:layout_height="98dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="261dp"
        android:layout_marginRight="124dp"
        android:onClick="sound_electric_shield"
        android:scaleType="center"
        android:src="@drawable/electric_shield" />


</RelativeLayout>

При нажатии на любую кнопку издаётся определённый звук. Но мне нужно чтобы кнопка с id: ID_electric_shield, при нажатии издавала звук(уже есть) и при зажатии на 2 секунды издавала другой звук


Ответы (2 шт):

Автор решения: Exynos

Используй OnTouchListener. Вот простой пример.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/playButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

import androidx.annotation.RawRes;
import androidx.appcompat.app.AppCompatActivity;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    private long down;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.playButton).setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                down = System.currentTimeMillis();
                break;
            case MotionEvent.ACTION_UP:
                if (System.currentTimeMillis() - down < 2000)
                    play(R.raw.sweep);
                else
                    play(R.raw.game_over);
                break;
        }
        return false;
    }

    private void play(@RawRes int soundResource) {
        final MediaPlayer player = MediaPlayer.create(this, soundResource);
        player.start();
    }
}
→ Ссылка
Автор решения: Exynos

Я немного видоизменил код под работу с несколькими кнопками:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/playButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <Button
        android:id="@+id/playButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/playButton1"
        app:layout_constraintRight_toRightOf="parent"/>

    <Button
        android:id="@+id/playButton3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/playButton2"
        app:layout_constraintRight_toRightOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

    public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Handler
                touchHandler1 = new Handler(new PressPlayer(1000, R.raw.game_over, R.raw.sweep)),
                touchHandler2 = new Handler(new PressPlayer(2000, R.raw.sweep, R.raw.game_over));
        findViewById(R.id.playButton1).setOnTouchListener(touchHandler1);
        findViewById(R.id.playButton2).setOnTouchListener(touchHandler1);
        findViewById(R.id.playButton3).setOnTouchListener(touchHandler2);
    }

    class PressPlayer implements Handler.PressListener {
        final private int raw1, raw2, timeout;

        public PressPlayer(int timeoutMs, @RawRes int sound1, @RawRes int sound2) {
            this.raw1 = sound1;
            this.raw2 = sound2;
            this.timeout = timeoutMs;
        }

        @Override
        public void pressed(int ms) {
            MediaPlayer.create(MainActivity.this, ms < timeout ? raw1 : raw2).start();
        }
    }
}

class Handler implements View.OnTouchListener {
    final private Map<Integer, Long> timestamp = new HashMap<>();
    private PressListener listener = null;

    public Handler() {}

    public Handler(PressListener listener) {
        setPressListener(listener);
    }

    public void setPressListener(PressListener listener) {
        this.listener = listener;
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                timestamp.put(view.getId(), System.currentTimeMillis());
                break;
            case MotionEvent.ACTION_UP:
                final Long stamp = timestamp.remove(view.getId());
                if (listener != null && stamp != null)
                    listener.pressed((int) (System.currentTimeMillis() - stamp));
                break;
        }
        return false;
    }

    public interface PressListener {
        void pressed(int ms);
    }
}
→ Ссылка