Estou tentando criar um botão sempre op-top / imagem clicável que fica no topo de todas as janelas o tempo todo.
A prova de conceito é
- aqui - Barra de tarefas inteligente (no AppBrain)
- e aqui SWKey estilo V1.4.0 da barra lateral - salvador de botões (em xda-developers)
Fui bem-sucedido e tenho um serviço em execução agora. O serviço exibe algum texto no canto superior esquerdo da tela o tempo todo, enquanto o usuário pode interagir livremente com o restante dos aplicativos da maneira normal.
O que estou fazendo é subclasse ViewGroup
e adicione-o ao gerenciador de janelas raiz com sinalizador TYPE_SYSTEM_OVERLAY
. Agora, quero adicionar um botão / imagem clicável no lugar deste texto que possa receber eventos de toque em si mesmo. Tentei substituir "onTouchEvent" no todo, ViewGroup
mas ele não recebe nenhum evento.
Como posso receber eventos apenas em certas partes do meu grupo de visualizações sempre no topo? Por favor, sugira.
public class HUD extends Service {
HUDView mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
mView = new HUDView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
0,
// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
params.setTitle("Load Average");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show();
if(mView != null)
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
mView = null;
}
}
}
class HUDView extends ViewGroup {
private Paint mLoadPaint;
public HUDView(Context context) {
super(context);
Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show();
mLoadPaint = new Paint();
mLoadPaint.setAntiAlias(true);
mLoadPaint.setTextSize(10);
mLoadPaint.setARGB(255, 255, 0, 0);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("Hello World", 5, 15, mLoadPaint);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//return super.onTouchEvent(event);
Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
return true;
}
}
onDraw()
esteja sendo chamado. Em dispatchDraw()
vez disso, não deve ser substituído? Consulte groups.google.com/forum/?fromgroups#!topic/android-developers/…