Я пытаюсь нарисовать значок поверх всего на экране (САМЫЙ ТОП), похожий на заголовок чата нового мессенджера Facebook.
Я создал службу для работы в фоновом режиме, и в зависимости от определенного условия мой значок должен появиться на экране (точно так же, как когда кто-то отправляет вам сообщение на Facebook, служба обмена сообщениями перехватывает сообщение и показывает заголовок чата на экране, чтобы уведомить ты о новом сообщении)
Что я сделал:
Я создал службу и дал ей разрешение показывать окна системных предупреждений (поскольку голова на самом деле является окном системных предупреждений)
[assembly: UsesPermission(Name = Android.Manifest.Permission.SystemAlertWindow)]
Я унаследовал класс (StickyHeadView) от ImageView и реализовал прослушиватель OnTouchListener следующим образом:
class StickyHeadView : ImageView, Android.Views.View.IOnTouchListener
{
private StickyHeadService OwnerService;
public StickyHeadView(StickyHeadService ContextService, Context context)
: base(context)
{
OwnerService = ContextService;
SetOnTouchListener(this);
}
float TouchMoveX;
float TouchMoveY;
public bool OnTouch(View v, MotionEvent e)
{
var windowService = OwnerService.GetSystemService(Android.Content.Context.WindowService);
var windowManager = windowService.JavaCast<Android.Views.IWindowManager>();
switch (e.Action & e.ActionMasked)
{
case MotionEventActions.Move:
TouchMoveX = (int)e.GetX();
TouchMoveY = (int)e.GetY();
OwnerService.LOParams.X = (int)(TouchMoveX);
OwnerService.LOParams.Y = (int)(TouchMoveY);
windowManager.UpdateViewLayout(this, OwnerService.LOParams);
Log.Debug("Point : ", "X: " + Convert.ToString(OwnerService.LOParams.X) + " Y: " + Convert.ToString(OwnerService.LOParams.Y));
return true;
case MotionEventActions.Down:
return true;
case MotionEventActions.Up:
return true;
}
return false;
}
}
У службы есть оконный менеджер, чтобы показать значок на нем... в событии службы "OnStart" я инициализирую голову:
private StickyHeadView MyHead;
public Android.Views.WindowManagerLayoutParams LOParams;
public override void OnStart(Android.Content.Intent intent, int startId)
{
base.OnStart(intent, startId);
var windowService = this.GetSystemService(Android.Content.Context.WindowService);
var windowManager = windowService.JavaCast<Android.Views.IWindowManager>();
MyHead = new StickyHeadView(this, this);
MyHead.SetImageResource(Resource.Drawable.Icon);
LOParams = new Android.Views.WindowManagerLayoutParams(Android.Views.WindowManagerLayoutParams.WrapContent,
Android.Views.WindowManagerLayoutParams.WrapContent,
Android.Views.WindowManagerTypes.Phone,
Android.Views.WindowManagerFlags.NotFocusable,
Android.Graphics.Format.Translucent);
LOParams.Gravity = GravityFlags.Top | GravityFlags.Left;
LOParams.X = 10;
LOParams.Y = 10;
windowManager.AddView(MyHead, LOParams);
}
как видите, я объявил WindowManager и добавил к нему представление (MyHead) со специальными параметрами.
Моя проблема:
Всякий раз, когда я пытаюсь двигать вид (мою голову), он не двигается стабильно и продолжает трястись!
Я тестирую его с помощью Android 4.0.4 на реальном телефоне HTC.
я пользуюсь монодроидом
Помогите пожалуйста...если реализация тача не правильная предложите способ лучше...спасибо.