如何在Android中与xamarin forms图像交互?

如何在Android中与xamarin forms图像交互?,xamarin,xamarin.android,imageview,xamarin.forms,custom-renderer,Xamarin,Xamarin.android,Imageview,Xamarin.forms,Custom Renderer,我有一张Xamarin格式的图像。我想使用本机android功能与此图像交互。例如,当点击图像时,我想知道点击图像的x,y坐标。我可以使用Android ImageView,但我不确定如何将Xamarin表单图像转换为Android ImageView [assembly: ExportRenderer(typeof(Image), typeof(FloorplanImageRenderer))] namespace EmployeeApp.Droid.Platform { public

我有一张Xamarin格式的图像。我想使用本机android功能与此图像交互。例如,当点击图像时,我想知道点击图像的x,y坐标。我可以使用Android ImageView,但我不确定如何将Xamarin表单图像转换为Android ImageView

[assembly: ExportRenderer(typeof(Image), typeof(FloorplanImageRenderer))]
namespace EmployeeApp.Droid.Platform
{

  public class FloorplanImageRenderer : ImageRenderer
  {
        protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
        {
            if (Control == null)
            {

                var imageView = (ImageView)e.NewElement; // This is not right

            }

            base.OnElementChanged(e);
        }
   }
}
[程序集:导出渲染器(typeof(图像)、typeof(FloorplanImageRenderer))]
命名空间EmployeeApp.Droid.Platform
{
公共类FloorplanImageRenderer:ImageRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
if(Control==null)
{
var imageView=(imageView)e.NewElement;//这不正确
}
基础。一个要素发生变化(e);
}
}
}

但是控件是空的

不,它不应该是空的。回到您的问题,我认为首先,您需要在PCL中的图像控件上附加一个触摸事件,并创建一个属性,以便在触摸图像时保持坐标。我认为在你的代码中:

[assembly: ExportRenderer(typeof(Image), typeof(FloorplanImageRenderer))]
我认为这里的
图像
应该是您的自定义图像控件,它继承了PCL中的图像

为触摸事件创建一个界面:

公共接口IFloorplanImageController
{
无效();
}
为图像创建自定义控件:

公共类FloorplanImage:Image,IFloorplanImageController
{
公共事件处理人;
公共图书馆
{
触摸?.Invoke(此为EventArgs.Empty);
}
公共元组接触坐标
{
get{return(元组)GetValue(TouchedCoordinateProperty);}
set{SetValue(TouchedCoordinateProperty,value);}
}
公共静态只读BindableProperty TouchedCoordinateProperty=
BindableProperty.Create(
propertyName:“TouchedCoordinate”,
returnType:typeof(元组),
declaringType:typeof(楼层平面图),
defaultValue:新元组(0,0),
propertyChanged:OnPropertyChanged);
公共静态void OnPropertyChanged(BindableObject bindable、object oldValue、object newValue)
{
}
}
实现自定义渲染器:

[程序集:导出渲染器(typeof(FloorplanImage)、typeof(FloorplanImageRenderer))]
命名空间EmployeeApp.Droid.Platform
{
公共类FloorplanImageRenderer:ImageRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
if(控件!=null)
{
Control.Clickable=true;
Control.SetOnTouchListener(ImageTouchListener.Instance.Value);
SetTag(Control.Id,新的JavaObjectWrapper{Obj=Element as FloorplanImage});
}
}
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
if(控件!=null)
{
Control.SetOnTouchListener(null);
}
}
基地。处置(处置);
}
私有类ImageTouchListener:Java.Lang.Object、Android.Views.View.IOnTouchListener
{
公共静态只读惰性实例=新建惰性实例(
()=>新建ImageTouchListener());
公共bool OnTouch(Android.Views.View v,MotionEvent e)
{
var obj=v.GetTag(v.Id)作为JavaObjectWrapper;
var元素=对象。对象;
var控制器=作为IFloorplanImageController的元素;
if(e.Action==Android.Views.MotionEventActions.Down)
{
var x=e.GetX();
变量y=e.GetY();
element.TouchedCoordinate=新元组(x,y);
控制器?.SendTouched();
}
else if(e.Action==Android.Views.MotionEventActions.Up)
{
}
返回false;
}
}
}
公共类JavaObjectWrapper:Java.Lang.Object
{
公共T对象{get;set;}
}
}
像这样使用此控件:


代码隐藏:

private void image\u(对象发送方,事件参数e)
{
var cor=image.touched坐标;
}

检查渲染器本身的
元素
属性我怎么做?对不起,我弄错了,您正在检查null的
控件
属性包含本机变量。我总是混淆这两个:)但是控件是空的…所以创建一个检查,当它不是空的时候。你可能想了解一下定制渲染器谢谢,这正是我想要的。你能给我指一些ios的示例代码吗?@stepheaw,对不起,我对ios不熟悉。