我正在尝试在屏幕上的所有内容(TOP MOST)上绘制一个图标,类似于新 Facebook Messenger 的聊天头
我已经创建了一个在后台工作的服务,并且根据特定条件,我的图标应该出现在屏幕上(就像有人在 facebook 上向您发送消息时,Messenger 服务将挂钩消息并在屏幕上显示聊天头以通知你关于新消息)
我做了什么:
我已经创建了该服务并授予它显示系统警报窗口的权限(因为头部实际上是一个系统警报窗口)
[assembly: UsesPermission(Name = Android.Manifest.Permission.SystemAlertWindow)]
我从 ImageView 继承了一个类(StickyHeadView)并使用以下方式实现了 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”事件中我初始化了 Head :
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)
我的问题 :
当我尝试移动视图(我的头)时,它不会以稳定的方式移动并不断发生地震!
我正在真正的 HTC 手机上使用 android 4.0.4 对其进行测试
我正在使用单机器人
请帮助...如果触摸的实施不正确,请提出更好的方法...谢谢。