Xamarin表单在视图之间拖动图像

时间:2018-03-27 14:22:45

标签: c# ios xamarin xamarin.forms xamarin.android

我在Xamarin Forms中有一个应用程序,我需要用户可以从下面选择一个图像并在顶视图中拖动他想要的任何地方,这个想法是:下面带有图像的视图是家庭房间,以及顶视图是Houseplant,用户可以通过拖动和旋转图像来创建他的室内植物,然后最终将顶视图保存为jpg或png图像。

我在这里搜索了2个关于拖动等的3页谷歌,但是我还没有找到任何可以帮助我的东西,我尝试了平移手势,轻拍手势,但没有成功= [

对不起,如果它是重复的或其他什么,这是我的第一篇文章,我真的找不到任何东西。

如何在Xamarin.Forms或至少使用自定义渲染器等工作?

谢谢你们。

Sample image of what I need

2 个答案:

答案 0 :(得分:0)

为XAML中的图像:

double x; // totalX for the pan gesture
double y; // totalY for the pan gesture

您实际上可以使用平移手势识别器在C#中拖放图像:

定义变量:

PanGestureRecognizer panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += PanUpdated;
image.GestureRecognizers.Add(panGesture);

初始化平移手势并将其添加到图像中:

void PanUpdated(object sender, PanUpdatedEventArgs args)
{
    if (args.StatusType.Equals(GestureStatus.Running)) {
        x = args.TotalX;
        y = args.TotalY;

        image.TranslateTo(x, y, 1);
    }
    else if (args.StatusType.Equals(GestureStatus.Completed)) {
        // set the layout bounds of the image to the new position
        // method varies depending on what type of layout you are using for the image

        // eg. assume the image is in an absolute layout
        // where the layout height is the screen height
        // and the layout width is the screen width

        Task.Run(() => {
            Device.BeginInvokeOnMainThread(async () => // run UI task on main thread
            {
                await Task.Delay(50); // avoid flickering

                var screenWidth = Application.Current.MainPage.Width;
                var screenHeight = Application.Current.MainPage.Height;

                var b = image.Bounds;
                var newBounds = new Rectangle(b.X + x, b.Y + y, b.Width, b.Height);

                var newAbsoluteBound =
                    new Rectangle(newBounds.X / (screenWidth - newBounds.Width),
                                  newBounds.Y / (screenHeight - newBounds.Height),
                                  newBounds.Width / screenWidth,
                                  newBounds.Height / screenHeight);

                // set new absolute bounds so a new TranslateTo can be applied

                AbsoluteLayout.SetLayoutBounds(image, newAbsoluteBound);
                await image.TranslateTo(0, 0, 0);
            });
        });              
    }
}

手势的事件处理程序:

-Wconversion

答案 1 :(得分:0)

确保页面或图像不在scrollView中。 如果两个方向都启用了ScrollView,则Pan-Gesture将不起作用。 。