Действие при зажатии кнопки
Всем привет, нужна помощь! Есть код
содержимое 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);
}
}