允许用户调整android控件的大小



我正在开发一个android应用程序,计划在其中显示天气详细信息。除了天气细节外,还会有另一个控件显示最新消息。我打算做的是,如果用户可以在应用程序中以某种方式调整天气和新闻控件的大小,并通过触摸手势将这两个控件放置在应用程序的任何位置。

我计划使用Xamarin,但愿意接受建议。

我一直在谷歌上寻找实现这一目标的最佳方法,但找不到任何帮助。

您可以通过以下步骤实现拖放:

  1. 使用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>
    
  2. 将按钮的长点击事件注册为拖放事件,并在事件中调用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);
    }
    
  3. 注册AbsoluteLayoutDrag事件以接收掉落并在用户掉落时翻译按钮:

    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中拖放的详细信息,请参阅拖放。

最新更新