Sto cercando di creare un pulsante / immagine cliccabile sempre in primo piano che rimanga sempre in cima a tutte le finestre.
La prova del concetto è
- qui - Smart Taskbar (su AppBrain)
- e qui V1.4.0 Stile barra laterale SWKey - Button salvior (su sviluppatori xda)
Ho avuto successo e ho un servizio in esecuzione ora. Il servizio visualizza continuamente del testo nell'angolo in alto a sinistra dello schermo, mentre l'utente può interagire liberamente con le altre app in modo normale.
Quello che sto facendo è una sottoclasse ViewGroup
e aggiungerla al gestore della finestra di root con flag TYPE_SYSTEM_OVERLAY
. Ora voglio aggiungere un pulsante / immagine cliccabile al posto di questo testo che può ricevere eventi touch su se stesso. Ho provato a sovrascrivere "onTouchEvent" per l'intero, ViewGroup
ma non riceve alcun evento.
Come posso ricevere eventi solo su alcune parti del mio gruppo di visualizzazione sempre in primo piano? Si prega di suggerire
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()
venga chiamato. Non dovrebbe dispatchDraw()
essere sostituito invece? Vedi groups.google.com/forum/?fromgroups#!topic/android-developers/…