Ich versuche, eine Schaltfläche / ein anklickbares Bild zu erstellen, die immer über allen Fenstern angezeigt wird.
Der Proof of Concept ist
- hier - Smart Taskbar (auf AppBrain)
- und hier V1.4.0 Sidebar-Stil SWKey - Button Saviour (bei xda-Entwicklern)
Ich war erfolgreich und habe jetzt einen laufenden Dienst. Der Dienst zeigt ständig Text in der oberen linken Ecke des Bildschirms an, während der Benutzer auf normale Weise frei mit anderen Apps interagieren kann.
Was ich mache, ist eine Unterklasse ViewGroup
und füge sie dem Root-Fenstermanager mit Flag hinzu TYPE_SYSTEM_OVERLAY
. Jetzt möchte ich anstelle dieses Textes eine Schaltfläche / ein anklickbares Bild hinzufügen, das Berührungsereignisse für sich selbst empfangen kann. Ich habe versucht, "onTouchEvent" für das Ganze zu überschreiben, ViewGroup
aber es wird kein Ereignis empfangen.
Wie kann ich Ereignisse nur für bestimmte Teile meiner Gruppe "Immer im Blick" empfangen? Bitte vorschlagen.
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()
angerufen werden. Sollte dispatchDraw()
stattdessen nicht überschrieben werden? Siehe groups.google.com/forum/?fromgroups#!topic/android-developers/…