2017-04-13 113 views
3

an issue与Android上的地图标记,似乎没有人可以解决它。解决方法是点击地图标记3次,它会正确打开内部图像的标注/注释。当一个标记被点击时,我想点击它3次

如何以编程方式执行此操作?每次用户点击时,我都想点击标记3次。

<MapView.Marker 
    key={marker.key} 
    coordinate={marker.latlng} 
    title={marker.title} 
    description={marker.description} 
> 
    <MapView.Callout style={styles.annotation}> 
    <Image 
     key={marker.key} 
     source={{ uri: marker.image }} 
     style={styles.thumbnail} 
    /> 
    </MapView.Callout> 
</MapView.Marker> 
+0

你确定问题不在别的地方吗?你能分享一些你的代码吗? – Xidh

+0

@Xidh我在问题中添加了我的标记和标注。 – User

+0

@用户可以提供完整的代码示例或小提琴吗? – ProllyGeek

回答

5

tl; dr:由于安全原因,这是不可能的。如果用户应用程序能够创建“合成”触摸,则恶意应用程序可以使用此功能强制用户的设备“独立”执行操作。如果您想阅读我对该主题的研究,请继续阅读。

就我所知,您无法在React Native的JavaScript端执行此操作。您需要设置一些自定义逻辑才能在本机发出本地事件。

原因是React Native的JS端只能处理通过本地桥接收到的本地事件(如触摸)。然后这些事件将触发事件处理代码,例如Touchable*组件提供的事件处理代码(例如TouchableHighlight,TouchableOpacity等)。据我所知,按照单向数据流的原则,没有办法从JS端发出本地事件。

在另一方面,当你可以发射从本机端任意本地事件,你将无法知道什么是JavaScript端做,除非你以某种方式检查得到的数据发送到渲染方法上土着方面,如果不是不可能的话,这可能会很艰难。

去这个问题,因此会创造一个触发时,它被触摸多点触摸事件的本机代码自定义视图类,并作为iOSAndroid指南描述它包装成一个阵营机组件的最佳方式。但是,执行此操作时存在以下问题:

在iOS中,没有公开的用户代码创建方法来创建UITouch对象并将它们分派到UI。你需要使用未公开的API方法来做到这一点,它可以在任何时候改变,如果你尝试将它提交给App Store,将会拒绝你的应用。有一种方法可以做到这一点here,但它可能已经过时,因为苹果公司不保证未公开的API保持稳定。有a fewanswers on SO already为什么在iOS上模拟触摸事件不是一个好主意,让您的应用程序被拒绝。

在Android上,this has been discussed at length on the android-platform mailing list,普遍认为应该不可能触发来自用户代码的任意触摸事件。试图以编程方式发送MotionEvent似乎会导致奇怪和不可靠的行为,如在this question的第二个答案中所看到的,对该答案的后续评论以及对this question的回答。

Even React Native不创建自己的触摸事件 - 它只是接收由本机视图生成的触摸事件。所有React Native Gesture Responder System只是包装本机端可用的公共API--用于创建触摸事件的API似乎不公开。

所有这一切都在一起,让我相信你想要做的是根本不可能,而无需使用专用的iOS/Android的API的,很可能是出于安全考虑

+0

即使您无法创建合成触摸,您也应该能够直接调用处理触摸事件的函数,不是吗? –

+0

是的,你可以,但在这种情况下,这实际上是不够的,因为地图实际上是[本地组件](https://github.com/airbnb/react-native-maps/blob/master/lib/components/ MapView.js#L661)。调用触摸处理程序实际上不会实现发布问题的用户所需的内容,因为触摸处理程序只能影响事物的JS方面的值,并且他们想要解决的问题在本机方面。 –

相关问题