Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加上「;兴趣点“;给一个形象_Java_Android_Android Imageview - Fatal编程技术网

Java 加上「;兴趣点“;给一个形象

Java 加上「;兴趣点“;给一个形象,java,android,android-imageview,Java,Android,Android Imageview,我正在尝试制作一个地形图应用程序。我一直在学习很多新东西,但我真的在为一些看似简单的事情而挣扎 基本上我有一个位图图像,可以通过一些代码添加到ImageView的子类中进行缩放和平移 现在我需要能够做的是向这个图像添加点,当它被平移和缩放时,这些点在位图上保持不变。这些点就像谷歌地图上的图钉。我希望能够点击它们来显示信息等,但我甚至不知道如何开始这样做 任何人都可以分享如何做这件事的信息吗?以下是我的想法: 将扩展的ImageView添加到包含所有点的RelativeLayout。他们可能是

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

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

现在我需要能够做的是向这个图像添加点,当它被平移和缩放时,这些点在位图上保持不变。这些点就像谷歌地图上的图钉。我希望能够点击它们来显示信息等,但我甚至不知道如何开始这样做

任何人都可以分享如何做这件事的信息吗?

以下是我的想法:

将扩展的
ImageView
添加到包含所有点的
RelativeLayout
。他们可能是

  • 其他
    imageview
    如果要使用cusom标记(可绘图),或
  • 您可以创建另一个扩展
    视图的自定义类(覆盖
    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();
}
注意:

  • 如果您想使其在API 11下工作,您可以将其用于X和Y动画,您可以修改标记的边距(idk您更喜欢哪一个)
  • 如果您有大量的点标记,这可能需要大量的内存和cpu,如果是这种情况,您可能需要一个自定义视图来完成所有工作(在需要的位置放置动画和绘图)

  • 标题不是很重要,请修改…谢谢回复。我已经查看了代码并尝试实现它,但它似乎没有做任何事情,然后在调用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();
    }