【发布时间】:2013-11-29 20:56:21
【问题描述】:
我正在开发一个遗留的 android 应用程序,它使用一个自定义类 (TouchGallery),该类扩展了 Gallery 类以将 JPG 显示为杂志中的页面。在某些页面上会有一个或多个可触摸(动态添加)的叠加层,以触发 Intent 以打开带有 URL 的浏览器。我已经设法在覆盖的onDraw() 方法中在页面上绘制了叠加层。但是,现在我的问题是检测触摸了哪个浓缩覆盖。
页面是可缩放的(因此用户可以放大和缩小),并且如果放大,他们可以在页面周围平移。 TouchGallery 类得到接触,我可以将接触传递给我的 ScalableImageView 自定义类。我的问题是要知道画布上的触摸在哪里,以便我可以将正确的 URL 发送到浏览器。我相信您已经知道MotionEvent 坐标基于屏幕而不是画布。
当图像完全缩小时,我设法使触摸工作(到一定程度)。然而,一旦页面被缩放,触摸坐标就不再靠近它们需要的位置。我使用比例值(screenWidth / bitmapWidth = scaleValue)将我的触摸坐标“转换”为完全可见的图像。我认为这种方法不可行。
画布用于绘图时没有触摸坐标。但我认为我想做的事情是可能的,因为如果你考虑一些绘图应用程序,你可以放大它,它会在正确的位置绘制线条(或正在绘制的任何东西)。
我的视图结构如下:
TouchGallery > TouchImageview > ScalableImageView > EnrichmentBlockView
有关自定义类的更多信息:
触摸画廊
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;博士
我需要检测画布上的触摸坐标,而不是屏幕上的触摸位置。或者,一种确定“视口”或将触摸坐标转换为画布坐标的方法。
【问题讨论】:
标签: android overlay android-canvas