Java 加上「;兴趣点“;给一个形象
我正在尝试制作一个地形图应用程序。我一直在学习很多新东西,但我真的在为一些看似简单的事情而挣扎 基本上我有一个位图图像,可以通过一些代码添加到ImageView的子类中进行缩放和平移 现在我需要能够做的是向这个图像添加点,当它被平移和缩放时,这些点在位图上保持不变。这些点就像谷歌地图上的图钉。我希望能够点击它们来显示信息等,但我甚至不知道如何开始这样做 任何人都可以分享如何做这件事的信息吗?以下是我的想法:Java 加上「;兴趣点“;给一个形象,java,android,android-imageview,Java,Android,Android Imageview,我正在尝试制作一个地形图应用程序。我一直在学习很多新东西,但我真的在为一些看似简单的事情而挣扎 基本上我有一个位图图像,可以通过一些代码添加到ImageView的子类中进行缩放和平移 现在我需要能够做的是向这个图像添加点,当它被平移和缩放时,这些点在位图上保持不变。这些点就像谷歌地图上的图钉。我希望能够点击它们来显示信息等,但我甚至不知道如何开始这样做 任何人都可以分享如何做这件事的信息吗?以下是我的想法: 将扩展的ImageView添加到包含所有点的RelativeLayout。他们可能是
将扩展的
ImageView
添加到包含所有点的RelativeLayout
。他们可能是
- 其他
如果要使用cusom标记(可绘图),或imageview
- 您可以创建另一个扩展
视图的自定义类(覆盖
,并在内部使用onDraw
)绘制一个圆,但是您还应该覆盖画布.drawCircle(x,y,radius,paint);
,这更复杂…onMeasure
ImageView
类覆盖了onTouch
方法,但您没有发布任何代码,因此上面的草图只是显示了您应该使用标记来移动标记的内容(当然还有地图位图):
private ArrayList points=new ArrayList();
私有浮动dX,dY;
//...
公共无效添加点(图像视图点、浮点x、浮点y){
if(points.contains(point))返回;//避免重复
点。添加(点);
((RelativeLayout)getParent()).addView(点,新RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_内容,RelativeLayout.LayoutParams.WRAP_内容));
移动(点,x,y);
}
@凌驾
公共布尔onTouch(视图、运动事件){
开关(event.getActionMasked()){
case MotionEvent.ACTION\u DOWN:
dX=view.getX()-event.getRawX();
dY=view.getY()-event.getRawY();
打破
case MotionEvent.ACTION\u移动:
对于(ImageView p:points)移动(p,event.getRawX()+dX,event.getRawY()+dY);
打破
默认:返回false;
}
返回true;
}
专用空心移动(视图v、浮动x、浮动x){
v、 设置动画().x(x).y(y).setDuration(0).start();
}
注意:
标题不是很重要,请修改…谢谢回复。我已经查看了代码并尝试实现它,但它似乎没有做任何事情,然后在调用addPoint方法时崩溃。我最初没有重写onTouch方法,所以我只是将此代码添加到TouchImageView类(ImageView的子类,用于处理平移和缩放)。我对这方面还很陌生,所以说实话,我不太明白我在做什么。错误是:java.lang.IllegalStateException:指定的子级已经有父级。必须首先对子对象的父对象调用removeView()。如何定义点标记?它们是通过调用构造函数(
new…
)在运行时初始化的,还是通过xml布局声明并使用findViewById
方法提取的?由于这些点将由用户添加,它们可以添加不同的量,我是在运行时而不是在xml布局中添加的。但我几乎没有这项工作的任何代码;我被要求在对这些东西一无所知的情况下做点什么。
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();
}