Como o Facebook cria os Chat Heads no Android? Qual é a API para criar as visualizações flutuantes sobre todas as outras visualizações?
Como o Facebook cria os Chat Heads no Android? Qual é a API para criar as visualizações flutuantes sobre todas as outras visualizações?
Respostas:
Permite que um aplicativo abra janelas usando o tipo TYPE_SYSTEM_ALERT, mostrado no topo de todos os outros aplicativos. Muito poucos aplicativos devem usar esta permissão; essas janelas destinam-se à interação no nível do sistema com o usuário.
Valor constante: "android.permission.SYSTEM_ALERT_WINDOW"
// EDIT: O código completo aqui :
public class ChatHeadService extends Service {
private WindowManager windowManager;
private ImageView chatHead;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.android_head);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(chatHead, params);
}
@Override
public void onDestroy() {
super.onDestroy();
if (chatHead != null) windowManager.removeView(chatHead);
}
}
Não se esqueça de iniciar o serviço de alguma forma:
startService(new Intent(context, ChatHeadService.class));
.. E adicione este serviço ao seu manifesto.
Como regra, as atividades do Android são de tela cheia, UIs conceitualmente dedicadas que levam toda a interação. Existem algumas exceções para isso. Para começar, existem caixas de diálogo pop-up que não preenchem a tela. Outro é o brinde do Android, que é um pop-up não interativo - você não pode tocá-lo e, se tentar, irá para o que estiver por baixo.
Você também pode criar suas próprias interfaces de usuário especiais. Você pode adicionar visualizações diretamente ao WindowManager, especificando um sinalizador de tipo. O Chat Heads provavelmente usa TYPE_PHONE . Existem alguns tipos semelhantes, mas o objetivo é o mesmo: sobreposições de propósito especial que podem aparecer por cima de qualquer outra coisa sem que o aplicativo pai aparentemente esteja presente.
Isso só leva você até agora, por causa de problemas com a interação. No início, sua sobreposição absorverá toda a interação, para que a cabeça não apenas receba eventos, mas também bloqueie a interação com tudo que está por baixo.
Você configura esse comportamento usando o LayoutParams . FLAG_NOT_TOUCH_MODALsignifica que os eventos fora da sua área de exibição vão para as UIs subjacentes. Agora você verá que funciona, mas outras coisas ruins ainda acontecem, como os botões voltar / menu não são direcionados para aplicativos, além de nenhum teclado. Para resolver o que você precisa FLAG_NOT_FOCUSABLE.
Você também obtém um efeito colateral do bit não focalizável, que não é mais uma boa interação com a sobreposição, por exemplo, pressionamentos de botão. No entanto, você pode obter alguns eventos básicos de toque, nos quais sempre é possível fazer matemática, e isso provavelmente é suficiente para os Chat Heads. Esteja ciente de que isso deixa você sozinho em muitas áreas, como animação da interface do usuário.
Uma boa visão geral dos detalhes, inclusive permitindo o consumo seletivo de interação, pode ser encontrada neste encadeamento StackOverflow . Em particular, um dos links de resposta o levará até aqui , que é um bom exemplo de projeto. Observe que o ICS mudou como isso funciona um pouco, mas os threads explicam isso.
Isso é tudo sobre API pública, mas não parece realmente algo comum que devíamos estar fazendo normalmente. A documentação está repleta de referências a comportamentos especiais de aplicativos do sistema e por boas razões; e se todo mundo fizesse isso?
As cabeças elásticas proporcionam um comportamento baseado nas molas das cabeças de bate-papo fora da caixa. Tudo o que você precisa definir é o desenho para o cabeçalho do bate-papo e o fragmento para abrir assim que o cabeçalho for clicado. As cabeças do bate-papo são recolhidas quando minimizadas e seguem o dedo quando arrastadas.
O projeto inclui um aplicativo de demonstração que demonstra todas as funcionalidades incorporadas. Para usá-lo, você precisa adicioná-lo às dependências do gradle.
compile 'com.flipkart.springyheads:library:0.9.6'