android Studio 中按钮按下直到按钮被释放的监听器
Listener for Button press until button is released in android Studio
我试图在按下按钮时通过蓝牙连续发送数据直到它被释放,但在我的代码中,当按下或释放按钮时我只接收一次数据。
在这里,我使用 OnTouchListener
和 Action_Down and Action_Up
。
如果有人可以帮助我,那就太好了,谢谢。
fab1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView d;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:data[0]='H';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
case MotionEvent.ACTION_UP:
data[0]='L';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
}
当用户按下按钮时,您发送数据的以下代码只会被调用一次:
data[0]='H';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
您需要创建一个处理程序和可运行对象来连续调用您的发送函数并根据按钮事件启动和停止它。
可运行:
Runnable dataSender = new Runnable(){
@override
void run(){
if(isPressed && connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
handler.postDelayed(this,100) // for 100 milliseconds
}
else
return
}
}
处理程序:
Handler handler = new Handler(Looper.getMainLooper())
现在创建一个全局布尔变量 isPressed 并将其设置为 false。现在在您的 onTouchListener 中相应地设置 isPressed 并使用处理程序启动 runnable。
fab1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView d;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
isPressed = true
handler.post(dataSender) // start the handler
break;
case MotionEvent.ACTION_UP:
isPressed = false //to stop the handler
data[0]='L';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
}
我试图在按下按钮时通过蓝牙连续发送数据直到它被释放,但在我的代码中,当按下或释放按钮时我只接收一次数据。
在这里,我使用 OnTouchListener
和 Action_Down and Action_Up
。
如果有人可以帮助我,那就太好了,谢谢。
fab1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView d;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:data[0]='H';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
case MotionEvent.ACTION_UP:
data[0]='L';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
}
当用户按下按钮时,您发送数据的以下代码只会被调用一次:
data[0]='H';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
您需要创建一个处理程序和可运行对象来连续调用您的发送函数并根据按钮事件启动和停止它。
可运行:
Runnable dataSender = new Runnable(){
@override
void run(){
if(isPressed && connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
handler.postDelayed(this,100) // for 100 milliseconds
}
else
return
}
}
处理程序:
Handler handler = new Handler(Looper.getMainLooper())
现在创建一个全局布尔变量 isPressed 并将其设置为 false。现在在您的 onTouchListener 中相应地设置 isPressed 并使用处理程序启动 runnable。
fab1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView d;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
isPressed = true
handler.post(dataSender) // start the handler
break;
case MotionEvent.ACTION_UP:
isPressed = false //to stop the handler
data[0]='L';
if(connection_check)
{
d =findViewById(R.id.datacheck);
String str=String.valueOf(data)+"\n";
d.setText(str);
sendData.write(str.getBytes());
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not connected", Toast.LENGTH_LONG).show();
break;
}