添加"兴趣点"到一个图像

时间:2016-03-15 14:23:20

标签: java android android-imageview

我正在尝试制作地形图应用程序。我一直在学习很多新东西,但我真的在努力学习一些看似简单的事情。

基本上我有一个位图图像,可以通过添加到ImageView子类的一些代码进行缩放和平移。

现在我需要做的是为此图像添加点,这些图像在平移和缩放时保留在位图上。这些点就像谷歌地图上的引脚。我希望能够点击它们来显示信息等,但我甚至无法弄清楚如何开始这样做。

有人可以分享有关如何做到这一点的信息吗?

1 个答案:

答案 0 :(得分:1)

这是我的想法:

将您的扩展ImageView添加到包含所有积分的RelativeLayout。他们可以

  • 其他ImageViews如果您想使用cusom标记(drawables)或
  • 您可以创建另一个自定义类View(覆盖onDraw并在内部使用canvas.drawCircle(x, y, radius, paint);绘制一个圆圈),但是您还应该覆盖onMeasure,即更复杂......

我认为您的扩展ImageView类会覆盖onTouch方法,但您没有发布任何代码,因此上面的草图只显示您要移动的标记所做的事情它们(当然还有地图位图):

private ArrayList<ImageView> points = new ArrayList<ImageView>();
private float dX, dY;

//...

public void addPoint(ImageView point, float x, float y) {
    if (points.contains(point)) return; // to avoid duplicates
    points.add(point);
    ((RelativeLayout)getParent()).addView(point, new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
    move(point, x, y);
}

@Override
public boolean onTouch(View view, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            dX = view.getX() - event.getRawX();
            dY = view.getY() - event.getRawY();
            break;
        case MotionEvent.ACTION_MOVE:
            for (ImageView p : points) move(p, event.getRawX() + dX, event.getRawY() + dY);
            break;
        default: return false;
    }
    return true;
}

private void move(View v, float x, float x) {
    v.animate().x(x).y(y).setDuration(0).start();
}

注意:

  1. 如果你想让它在API 11以下工作,你可以使用NineOldAndroids用于X和Y动画 你可以修改标记的边距(idk)你更喜欢哪一个... ...
  2. 如果你有很多点标记,这可能需要大量的内存和cpu,如果是这种情况你可能需要一个自定义视图来做所有的事情(没有动画定位和在需要的位置绘图)