gpt4 book ai didi

java - 在 ACTION_DOWN 触摸事件中使用 Android 计时器错误

转载 作者:行者123 更新时间:2023-12-01 11:57:21 25 4
gpt4 key购买 nike

我一直在开发一个非常简单的应用程序。只有一个音乐文件、一个播放按钮,什么也没有。我试图做到这一点,以便在单击按钮时开始播放音乐,但我想让用户按住停止按钮 2 秒钟,直到停止播放,以防用户在 2 秒内释放按钮秒,计时器应该终止。

import android.app.ActionBar;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;

import java.util.Timer;
import java.util.TimerTask;

import static com.example.appname.R.raw.sound;


public class MainActivity extends ActionBarActivity {

boolean isPlaying = false;
ImageButton button;
MediaPlayer mp;
Timer timer;

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

button = (ImageButton) findViewById(R.id.playButton);
mp = MediaPlayer.create(this, sound);

button.setOnClickListener(imgButtonHandler);


}

View.OnClickListener imgButtonHandler;

{
imgButtonHandler = new View.OnClickListener() {

public void onClick(View v) {
if (!isPlaying) {
mp.start();
isPlaying = true;
button.setImageResource(R.drawable.stop);
button.setOnTouchListener(imgButtonTouchHandler);
}

}
};
}

View.OnTouchListener imgButtonTouchHandler;

{
imgButtonTouchHandler = new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
if (isPlaying) {
button.setImageResource(R.drawable.stop_highlighted);
timer.schedule(stopMusic(), 2000);

return true;
} else {
return false;
}

case MotionEvent.ACTION_UP:
if (isPlaying) {
if (timer != null){
timer.cancel();
timer = null;
}
return true;
} else {
return false;
}
// RELEASED
}
return false;
}
};
}

public TimerTask stopMusic() {
mp.reset();
mp = MediaPlayer.create(MainActivity.this, sound);
button.setImageResource(R.drawable.play);
isPlaying = false;
return null;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

}

我收到此错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void java.util.Timer.schedule(java.util.TimerTask, long)”

如果我删除计时器并将 stopMusic() 方法内容导入到 ACTION_UP 部分 - 那么它可以正常工作,但我没有 2 秒要求。看来我无法在 ACTION_DOWN 部分中执行计时器功能。有没有办法让我以不同的方式完成这个任务?还是我的代码有问题?

提前致谢。

最佳答案

您尚未初始化计时器,请先更正此错误。如果没有任何效果,请返回:

Timer timer;

您必须初始化它:

timer = new Timer();

关于java - 在 ACTION_DOWN 触摸事件中使用 Android 计时器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com