18

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

  • 如果用户滚动,覆盖也应该移动
  • 如果用户缩放,则不应缩放叠加层,而是保持它们与图像的相对位置

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

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

到目前为止我尝试过的

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

问题

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

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

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

分钟。API 级别:10

4

5 回答 5

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)

于 2013-01-02T06:09:20.550 回答
1

我认为这个可以帮助你

参考这个项目链接

当您单击它时,它会自动滚动图像并缩放图像。

于 2012-12-22T17:40:18.890 回答
1

您是否尝试过继承 View 并处理自己的用户手势?对于此类复杂行为,这是我的首选。它应该看起来像这样:

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

StackOverflow 上有大量关于这些单独任务的材料,如果您在其中任何一个方面需要额外帮助,请告诉我。

于 2012-12-31T13:05:43.233 回答
1

查看此示例项目https://github.com/jzafrila/AndroidImageHostpot

于 2013-04-24T12:03:32.983 回答
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 ); 

文档中的代码。

于 2016-01-07T13:40:07.247 回答