Android:Botoes pressionado ou solto = Diferente ações

Boa tarde,
Estou com o seguinte o problema, estou desennvolvendo uma aplicação que serve de controle, o mesmo envia comandos para o arduino, enquanto eu estiver segurando um botao quero que o led fique aceso, quando soltar o mesmo quero que apague,

link do Projeto

// Não sei se essa função está certa
btn1.setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if(btn1.isClickable()){
					dadosParaEnvio = "e";
					EnviarDados(dadosParaEnvio);
				}else if(btn1.isClickable() != true){ // Condição para apagar o led
					dadosParaEnvio = "j";
					EnviarDados(dadosParaEnvio);
				}
				return false;
			}
		});

Use if (event.getAction() == MotionEvent.ACTION_DOWN ) {

Boa tarde,obrigado pela resposta,mas ainda não funcionou do jeito esperado,quando mante-se pressionado ficava acesso e ao soltar apagava, mas pelo novo método que mencionou ao segurar ele acende e apaga rapidamente.
Tentei da seguinte forma…

btn1.setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if(event.getAction() == MotionEvent.ACTION_DOWN){
					dadosParaEnvio = "e";
					EnviarDados(dadosParaEnvio);
				}else{
					dadosParaEnvio = "j";
					EnviarDados(dadosParaEnvio);
				}
				return false;
			}
		});

Pessoal, a ideia é usar o onTouchListener comparando o MotionEvent mesmo. No entanto, isso não é o suficiente. Na realidade, o código é um pouco mais complicado que isso.

Temos três MotionEvents principais: down, up e move, o grande problema é que o down é disparado apenas uma vez quando o dedo toca o button pela primeira vez. Por isso que fazer um if só fará seu código ser disparado uma única vez.

Então, uma ideia seria fazer um while, porém não teríamos como controlar a condição de parada desse laço, fazendo nossa app ficar num comportamento parecido com loop infinito. Então, um jeito que funciona seria fazer um controlador como filho de uma AsyncTask e aproveitar o cancel dessa classe para conseguirmos matar esse “loop infinito”.

Como essa AsyncTask só faz sentido para esse botão, deixei-a como uma classe interna, obtendo o seguinte código:

public class MainActivity extends AppCompatActivity {

    private boolean clicando = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...

        Button botao = (Button) findViewById(R.id.botao);
        botao.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, final MotionEvent motionEvent) {
                ControleDoLed controle = new ControleDoLed();
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        clicando = true;
                        controle.execute();
                        break;
                    case MotionEvent.ACTION_UP:
                        clicando = false;
                        controle.cancel(true);
                        break;
                }
                return false;
            }
        });
    }


    private class ControleDoLed extends AsyncTask{

        @Override
        protected Object doInBackground(Object[] objects) {
            while (clicando) {
                Log.i("CONTROLE", "led aceso");
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.i("CONTROLE", "led apagado");
        }
    }
}
1 curtida

Ola,muito obrigado pela resposta,ela funcionou “quase perfeitamente”,apertando o botao e soltando rapidamente, o LED acendia com 100% de sua luminosidade e apagava com o tempo exato,mas porem, quando pressionado por um tempo a assim solto,o LED meio que demorava um pouco para se apagar.

Consegui meio que parcialmente resolver isso,quando apertava e soltava,ele acendia e apagava com tempos exatos, mesmo se fosse pressionado por um um tempo e solto ainda assim apagava no mesmo tempo que solto o botão,mas porem o LED não esta com 100% de sua luminosidade, quando o botão esta pressionado, parece que o LED esta acendendo e apagando numa velocidade grande,assim da a impressão de a luminosidade do LED estar fraca.

Aki esta o codigo que cheguei a esse ponto.

btn1.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View view, final MotionEvent motionEvent) {
				
				dadosParaEnvio = "e";
				EnviarDados(dadosParaEnvio);
				
				return false;
			}
		});

Ola, gostaria de reaver essa questão , o método acima que mostrei parece que so funciona corretamente em tablets.

O seu método que propôs ate funcionaria, mas porem, quando solto o botão ele demora para cancelar a ação alem de que o metodo protected void onCancelled() dentro de ControleDoLed nao executa quando solto o botao.

Se puder der alguma dica para o meu problema agradeceria.