Estoy tratando de crear un botón / imagen de clic siempre superior que permanezca en la parte superior de todas las ventanas todo el tiempo.
La prueba de concepto es
- aquí - Smart Taskbar (en AppBrain)
- y aquí V1.4.0 Barra lateral estilo SWKey - Salvador de botón (en xda-developers)
He tenido éxito y tengo un servicio en ejecución ahora. El servicio muestra algo de texto en la esquina superior izquierda de la pantalla todo el tiempo, mientras que el usuario puede interactuar libremente con el resto de aplicaciones de manera normal.
Lo que estoy haciendo es una subclase ViewGroup
y la agrego al administrador de la ventana raíz con una marca TYPE_SYSTEM_OVERLAY
. Ahora quiero agregar un botón / imagen en la que se pueda hacer clic en lugar de este texto que pueda recibir eventos táctiles en sí mismo. Intenté anular "onTouchEvent" para todo ViewGroup
pero no recibe ningún evento.
¿Cómo puedo recibir eventos solo en ciertas partes de mi grupo de vista siempre arriba? Amablemente sugiera.
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()
llamen. ¿No debería dispatchDraw()
ser anulado en su lugar? Ver groups.google.com/forum/?fromgroups#!topic/android-developers/…