我该怎么做这个浮动动作按钮,即使在Xamarin表单中也可以在后台模式下运行 [英] How can I do this floating action button where can run even in background mode in Xamarin forms
本文介绍了我该怎么做这个浮动动作按钮,即使在Xamarin表单中也可以在后台模式下运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我的示例:我需要它与其他应用程序建立连接...谢谢!
Here's my sample: I need this to be a connection in other apps... Thank you!
推荐答案
浮动Windows主要通过 WindowsManager 类实现.
Floating Windows are implemented primarily through the WindowsManager class.
这是您可以参考的简单示例.
Here is a simple sample you could refer to.
创建 FloatingService :
[Service]
class FloatingService : Service,Android.Views.View.IOnTouchListener
{
WindowManagerLayoutParams layoutParams;
IWindowManager windowManager;
View floatView;
public override void OnCreate()
{
base.OnCreate();
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
showFloatingWindow();
return StartCommandResult.NotSticky;
}
public override IBinder OnBind(Intent intent)
{
return null;
}
private void showFloatingWindow()
{
windowManager = GetSystemService(WindowService).JavaCast<IWindowManager>();
LayoutInflater mLayoutInflater = LayoutInflater.From(ApplicationContext);
floatView = mLayoutInflater.Inflate(Resource.Layout.floatview, null);
floatView.SetBackgroundColor(Android.Graphics.Color.Transparent);
floatView.SetOnTouchListener(this);
ImageView iv1 = floatView.FindViewById<ImageView>(Resource.Id.iv1);
ImageView iv2 = floatView.FindViewById<ImageView>(Resource.Id.iv2);
ImageView iv3 = floatView.FindViewById<ImageView>(Resource.Id.iv3);
iv1.Click += delegate { Toast.MakeText(ApplicationContext, "The first Image Click", ToastLength.Short).Show(); };
iv2.Click += delegate { Toast.MakeText(ApplicationContext, "The second Image Click", ToastLength.Short).Show(); };
iv3.Click += delegate { Toast.MakeText(ApplicationContext, "The third Image Click", ToastLength.Short).Show(); };
// set LayoutParam
layoutParams = new WindowManagerLayoutParams();
if (Build.VERSION.SdkInt >= Build.VERSION_CODES.O)
{
layoutParams.Type = WindowManagerTypes.ApplicationOverlay;
}
else
{
layoutParams.Type = WindowManagerTypes.Phone;
}
layoutParams.Flags = WindowManagerFlags.NotTouchModal;
layoutParams.Flags = WindowManagerFlags.NotFocusable;
layoutParams.Width = 400;
layoutParams.Height = 100;
layoutParams.X = 300;
layoutParams.Y = 300;
windowManager.AddView(floatView, layoutParams);
}
private int x;
private int y;
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
x = (int)e.RawX;
y = (int)e.RawY;
break;
case MotionEventActions.Move:
int nowX = (int) e.RawX;
int nowY = (int) e.RawY;
int movedX = nowX - x;
int movedY = nowY - y;
x = nowX;
y = nowY;
layoutParams.X = layoutParams.X+ movedX;
layoutParams.Y = layoutParams.Y + movedY;
windowManager.UpdateViewLayout(floatView, layoutParams);
break;
default:
break;
}
return false;
}
}
floatview.xml:
the floatview.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv1"
android:src="@android:drawable/ic_media_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/iv2"
android:src="@android:drawable/star_on"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/iv3"
android:src="@android:drawable/ic_menu_more"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
然后在您的Activity中启动FloatingService:
then in your Activity start FloatingService :
button.Click += async delegate
{
if (!Settings.CanDrawOverlays(this))
{
StartActivityForResult(new Intent(Settings.ActionManageOverlayPermission, Android.Net.Uri.Parse("package:" + PackageName)), 0);
}
else
{
StartService(new Intent(this, typeof(FloatingService)));
}
}
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
if (requestCode == 0)
{
if (!Settings.CanDrawOverlays(this))
{
}
else
{
StartService(new Intent(this, typeof(FloatingService)));
}
}
}
并添加< uses-permission android:name =" android.permission.SYSTEM_ALERT_WINDOW"/>
在您的 Manifest.xml
中.
效果如下:
这篇关于我该怎么做这个浮动动作按钮,即使在Xamarin表单中也可以在后台模式下运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文