Android:可在pannable画布上绘制叠加层来检测触摸位置

时间:2013-11-28 10:32:57

标签: android overlay android-canvas

我正在开发一个遗留的Android应用程序,它使用一个自定义类(TouchGallery)扩展Gallery类,将JPG显示为杂志中的页面。在某些页面上,将有一个或多个可触摸(动态添加)的叠加层,以触发Intent以使用URL打开浏览器。我已设法在覆盖的onDraw()方法中获取在页面上绘制的叠加层。但是,现在我的问题是检测触摸了哪个浓缩叠加。

页面是可扩展的(因此用户可以放大和缩小),如果放大,它们可以在页面上平移。 TouchGallery课程会触及,我可以将触摸传递到我的ScalableImageView自定义课程。我的问题是要知道画布上的触摸位置,以便我可以将正确的URL发送到浏览器。我确信您已经知道MotionEvent坐标是基于屏幕而不是画布。

当图像完全缩小时,我设法让触摸工作(到度)。但是,一旦页面被缩放,触摸坐标就不再接近它们所需的位置。我使用比例值(screenWidth / bitmapWidth = scaleValue)将我的触摸坐标“转换”为完全可见的图像。我不认为这种方法是可行的。

画布没有触摸坐标,因为它用于绘图。但我认为我想做的事情是可能的,因为如果你考虑一些绘图应用程序,你可以放大并在正确的位置绘制线条(或正在绘制的任何东西)。

我的视图结构如下: TouchGallery> TouchImageview> ScalableImageView> EnrichmentBlockView

有关自定义类的详细信息:

  

TouchGallery

     

TouchGallery extends Gallery implements ScaleGestureDetector.OnScaleGestureListener, GestureDetector.OnDoubleTapListener

     

处理加载JPG页面


  

TouchImageView

     

TouchImageView extends TwoDScrollView implements ScalableView, GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, GestureDetector.OnDoubleTapListener

     

处理手势(缩放,平移,双击)


  

ScalableImageView

     

ScalableImageView extends View implements BitmapConsumer, View.OnTouchListener

     

处理显示位图对象和EnrichmentBlockView

的图形

  

EnrichmentBlockView

     

EnrichmentBlockView extends View

     

处理叠加层的大小和我希望它能够处理特定浓缩叠加的触摸

是否可以setOnTouchListener()动态添加视图?如果是的话,我该怎么做呢?

我尝试动态添加按钮作为叠加层,但是当您添加两个以上的按钮时,页面缩放和平移变得非常缓慢。如果做得好,这会是最好的选择吗?我可能错误地添加了可能导致迟缓的观点。

TL;医生

我需要检测画布上的触摸坐标,而不是屏幕上的触摸位置。或者,一种确定“视口”或将触摸坐标转换为画布坐标的方法。

1 个答案:

答案 0 :(得分:0)

我设法通过在被覆盖的getLocationInWindow()事件中使用onTouch()并分别从motionEvent.getX()motionEvent.getY()减去x和y值来解决我的问题。然后我将这些值传递给 EnrichmentBlockView 自定义类。

基本上,将触摸坐标“转换”为画布坐标。然后在onDraw()我检查Rect对象是否包含我的“转换”坐标。如果坐标位于Rect中,则URL将传递给被触发的浏览器意图。

希望这可以帮助其他有类似问题的人。