Tôi đang cố gắng tạo một nút luôn luôn ở trên đỉnh / hình ảnh có thể nhấp luôn ở trên tất cả các cửa sổ mọi lúc.
Bằng chứng của khái niệm là
- tại đây - Thanh tác vụ thông minh (trên AppBrain)
- và ở đây V1.4.0 Kiểu thanh bên SWKey - Vị cứu tinh nút (trên xda-developers)
Tôi đã thành công và có một dịch vụ đang chạy. Dịch vụ hiển thị một số văn bản ở góc trên cùng bên trái của màn hình trong khi người dùng có thể tự do tương tác với các ứng dụng còn lại theo cách thông thường.
Những gì tôi đang làm là phân lớp ViewGroup
và thêm nó vào trình quản lý cửa sổ gốc bằng cờ TYPE_SYSTEM_OVERLAY
. Bây giờ tôi muốn thêm một nút / hình ảnh có thể nhấp vào thay cho văn bản này có thể nhận các sự kiện chạm vào chính nó. Tôi đã cố gắng ghi đè "onTouchEvent" cho toàn bộ ViewGroup
nhưng nó không nhận được bất kỳ sự kiện nào.
Làm cách nào tôi chỉ có thể nhận các sự kiện trên một số phần nhất định trong nhóm xem luôn ở trên cùng của mình? Vui lòng đề nghị.
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()
đang được gọi. dispatchDraw()
Thay vào đó không nên bị ghi đè? Xem nhóm.google.com/forum/?fromgroups