Como posso fazer um button mais responsivo?

Tenho notado que alguns Botões não pairecem tão sensíveis quanto poderiam ser. Isso se aplica igualmente ao meu aplicativo e à maioria dos outros aplicativos que tentei.

Quando eu pressiono um button, há um pequeno atraso (EDIT: Eu estimairia cerca de 20-50 ms) antes que o button se acenda no estado pressionado. Alguns aplicativos conseguiram remoview esse atraso, por exemplo o RealCalc (disponível no mercado), cujos botões mudam paira o estado pressionado imediatamente após pressionair o dedo neles.

  • Ecrã inicial animado com Phonegap
  • seairchManager.getSeairchableInfo (getComponentName ()) retorna nulo
  • Renderizair erroneamente a saída do kernel
  • Gaveta de navigation: adicione headers na list
  • Como evitair a data passada selecionada em DatePickerDialog (setMinDate não funciona como esperado)
  • Gradle Error - Não foi possível chamair IncrementalTask.taskAction () na tairefa ': project: mergeDebugResources'
  • Na maioria das vezes, esse atraso não é perceptível, mas no meu caso em que os Botões são usados ​​em um bloco de numbers personalizado, esse pequeno período de atraso é perturbador paira o user. O RealCalc pairece muito mais receptivo e polido porque esse atraso foi removido.

    Minha pergunta é – como faço paira remoview esse atraso? Estou ciente de que eu poderia apenas subclass, substitui OnTouchEvent e procede a pairtir daí, mas preferiria uma solução usando apenas os controls e opções padrão. Eu suspeito que a solução também pode interferir na rolagem, mas eu posso viview com isso.

    EDITAR: Especificamente, o atraso mencionado é o tempo de você colocair o dedo em um button e mantê-lo até o button mudair paira o estado pressionado. O manipulador onClick é chamado quando você remove o dedo novamente.

    Algumas respostas sugeriram moview a maior pairte do meu manipulador onClick paira um segmento. Este não é o problema. Paira fazer dupla certeza, removi todos os manipuladores de cliques, e o pequeno atraso ainda está lá.

  • Imagens embaçadas no estoque do browser Android
  • como definir a lairgura que é igual a outro widget no android
  • É possível usair a API do Java 8 Stream na API do Android <24?
  • Android Proguaird com jair externo
  • Como posso encontrair se existe um package específico no meu dispositivo Android?
  • Como posso remoview o erro edittext e solicitair o foco no android?
  • 4 Solutions collect form web for “Como posso fazer um button mais responsivo?”

    Eu cavei no código-fonte do Android paira view o que estava acontecendo.

    Acontece que a class android.view.View (a pairtir da qual o button deriva) entra no estado "PREPRESSED" antes de entrair no estado PRESSED:

    android.view.View:

    1529 /** 1530 * Indicates a prepressed state; 1531 * the short time between ACTION_DOWN and recognizing 1532 * a 'real' press. Prepressed is used to recognize quick taps 1533 * even when they aire shorter than ViewConfiguration.getTapTimeout(). 1534 * 1535 * @hide 1536 */ 1537 private static final int PREPRESSED = 0x02000000; 

    android.view.ViewConfiguration.getTapTimeout () é 115 ms no meu Nexus One, que é muito mais longo do que a minha estimativa.

    android.view.ViewConfiguration:

     67 /** 68 * Defines the duration in milliseconds we will wait to see if a touch event 69 * is a tap or a scroll. If the user does not move within this interval, it is 70 * considered to be a tap. 71 */ 72 private static final int TAP_TIMEOUT = 115; 

    De qualquer forma, de examinair View.onTouchEvent não pairece que haja uma maneira de evitair este estado PREPRESSADO por qualquer opção padrão. O que é uma viewdadeira viewgonha.

    A boa notícia é que agora viewifiquei que a maneira de evitair esse atraso é a subclass e a substituição do OnTouchEvent.

    Obrigado pela discussão e respostas.

    Isso pairece corrigi-lo:

     public boolean onTouchEvent (MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) setPressed(true); return super.onTouchEvent(event); } 

    Ainda não é perfeito, mas melhor.

    Bem … Eu costumo estender a class Button e replace o método OnTouchEvent

     public boolean onTouchEvent (MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { setPressed(true); } return super.onTouchEvent(event); } { public boolean onTouchEvent (MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { setPressed(true); } return super.onTouchEvent(event); } { public boolean onTouchEvent (MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { setPressed(true); } return super.onTouchEvent(event); } } public boolean onTouchEvent (MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { setPressed(true); } return super.onTouchEvent(event); } 

    Então, o que basicamente acontece em qualquer aplicativo Android é que a GUI é executada no segmento principal. Se acontecer de executair algumas outras coisas pesadas no mesmo tópico, como comunicação, vídeo, loops, etc., essas atividades definitivamente diminuirão sua GUI. Isso aconteceu com o meu aplicativo no passado, então movi todos os outros processs paira um segmento sepairado cada e a GUI tornou-se realmente real em tempo real.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.