带有叠加层的Android可缩放/可滚动ImageView

时间:2012-12-22 16:18:28

标签: android android-layout android-webview android-imageview

我想显示图像(包括滚动和缩放功能)。 另外,我需要动态地为图像添加一些叠加层。叠加层与图像中的内容有关系。

  • 如果用户滚动,叠加层也应该移动
  • 如果用户放大, 不应缩放叠加层,而应保持其相对位置 图像

换句话说:我想用一些标记来实现Map,但我提供了自己的地图材料。

我的主要问题是:我怎么能这样做?

到目前为止我尝试了什么

  • 我尝试在WebView内实现它,因为它提供了基本的缩放和缩放功能。但是,在没有使用Javascript和HTML的情况下,我没有成功添加叠加层(我认为这不是解决问题的一种非常方便的方法)。
  • 有些项目(即TouchImageView)正在实施滚动/缩放功能,但从我的角度来看,它们更难以添加自己的叠加功能。

问题

我的问题是否有简单的解决方案或方法?

在Android中运行时添加和移动视图的正确方法是什么? (通常,我会使用基本布局并使用边距 - 这是最佳做法吗?)

请有人指出我正确的方向。

最小。 API等级:10

5 个答案:

答案 0 :(得分:3)

我建议扩展View类并覆盖onDraw方法。 看看Canvas API

你可能有一个看起来像这样的onDraw方法:

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(mPosX, mPosY); //position of your actual data
    canvas.scale(mScaleFactor, mScaleFactor); // zoom factor
    map.draw(canvas); //you draw your map here
    canvas.restore(); //go back to saved state 
    //for each marker you have, do the same "save - translate - scale - draw" loop        
}

由于您不需要缩放标记,因此您可能不需要缩放步骤,但需要正确计算它们的位置。

根据您的#个对象等,您可能需要更优化的方式来绘制标记(例如,仅重新绘制已更改的矩形区域)。见View.invalidate(Rect)

答案 1 :(得分:1)

我认为这个可以帮到你

参考此项目Link

它具有自动滚动图像和缩放图像单击它时。

答案 2 :(得分:1)

您是否尝试过子类化View并处理自己的用户手势?这是我复杂行为的首选。看起来应该是这样的:

  • 在扩展View的类中,您应该在创建时实例化所需的图像并覆盖为Bitmap对象
  • OnScroll事件,您将计算此类滚动后图像和叠加层的形式,刷新位图并使当前视图无效
  • 使用GestureDetector,您可以处理捏合事件并像处理滚动事件一样处理放大/缩小事件
  • 请务必在更改位图后始终调用invalidate
  • 在onDraw方法
  • 期间绘制位图

关于StackOverflow上这些单独任务的大量资料,请告诉我您是否需要其中任何一个的adittional帮助。

答案 3 :(得分:1)

答案 4 :(得分:1)

经过很长一段时间,我找到了解决方案的确切答案:TileView

设置地图视图

@Override
protected void onCreate( Bundle savedInstanceState ) {
  super.onCreate( savedInstanceState );
  TileView tileView = new TileView( this );
  tileView.setSize( 2000, 3000 );  // the original size of the untiled image
  tileView.addDetailLevel( 1f, "tile-%d-%d.png");
  setContentView( tileView );
}

添加标记

tileView.addMarker( someView, 250, 500, -0.5f, -1.0f ); 

文档中的代码。