我正在开发一个android应用程序,计划在其中显示天气详细信息。除了天气细节外,还会有另一个控件显示最新消息。我打算做的是,如果用户可以在应用程序中以某种方式调整天气和新闻控件的大小,并通过触摸手势将这两个控件放置在应用程序的任何位置。
我计划使用Xamarin,但愿意接受建议。
我一直在谷歌上寻找实现这一目标的最佳方法,但找不到任何帮助。
您可以通过以下步骤实现拖放:
-
使用
AbsoluteLayout
:创建xaml文件<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light"> <Button android:id="@+id/btnDrapDrop" android:layout_width="200dp" android:layout_height="50dp" android:text="Button To Drag"/> </AbsoluteLayout>
-
将按钮的长点击事件注册为拖放事件,并在事件中调用
View.StartDrag
:Button btnDrapDrop; ... btnDrapDrop.LongClick += BtnDrapDrop_LongClick; ... private void BtnDrapDrop_LongClick(object sender, Android.Views.View.LongClickEventArgs e) { ClipData dragData = ClipData.NewPlainText("", ""); View.DragShadowBuilder myShadow = new View.DragShadowBuilder(btnDrapDrop); btnDrapDrop.StartDrag(dragData, myShadow, null, 0); }
-
注册
AbsoluteLayout
的Drag
事件以接收掉落并在用户掉落时翻译按钮:AbsoluteLayout layout; ... layout.Drag += BtnDrapDrop_Drag; ... private void BtnDrapDrop_Drag(object sender, View.DragEventArgs e) { AbsoluteLayout layout = (AbsoluteLayout)sender; switch (e.Event.Action) { case DragAction.Drop: float x=e.Event.GetX(); float y = e.Event.GetY(); btnDrapDrop.TranslationX = x; btnDrapDrop.TranslationY = y; layout.Invalidate(); return; } }
以下是完整的活动:
当您长按按钮时,该事件将起作用。
public class MainActivity : Activity
{
Button btnDrapDrop;
AbsoluteLayout layout;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Second);
btnDrapDrop=FindViewById<Button>(Resource.Id.btnDrapDrop);
layout = FindViewById<AbsoluteLayout>(Resource.Id.layout);
//register the long click event of drap button
btnDrapDrop.LongClick += BtnDrapDrop_LongClick;
//register the drag event of the layout
layout.Drag += BtnDrapDrop_Drag;
}
private void BtnDrapDrop_Drag(object sender, View.DragEventArgs e)
{
AbsoluteLayout layout = (AbsoluteLayout)sender;
switch (e.Event.Action)
{
case DragAction.Drop:
float x=e.Event.GetX();
float y = e.Event.GetY();
btnDrapDrop.TranslationX = x;
btnDrapDrop.TranslationY = y;
layout.Invalidate();
return;
}
}
private void BtnDrapDrop_LongClick(object sender, Android.Views.View.LongClickEventArgs e)
{
ClipData dragData = ClipData.NewPlainText("", "");
View.DragShadowBuilder myShadow = new View.DragShadowBuilder(btnDrapDrop);
btnDrapDrop.StartDrag(dragData, myShadow, null, 0);
}
}
有关Android中拖放的详细信息,请参阅拖放。