Java android:自定义ImageView onDraw方法未在y轴上正确绘制

Java android:自定义ImageView onDraw方法未在y轴上正确绘制,java,android,imageview,scaling,Java,Android,Imageview,Scaling,我试图用地图追踪一个人在建筑物内的位置。当用户启动时,它们应该位于307房间的门口,但当我绘制它们时(由绿色圆圈指示),它们正确地放置在x轴上,但在y轴上太高。我的缩放代码或定位是否有错误?用户从x=163,y=414开始。canvas.getHeight()是否不返回我在使用fillStart时使用的值 我已经为MyImageView编写了以下onDraw方法,主要活动跟踪用户当前的x,y坐标: public class MyImageView extends ImageView {

我试图用地图追踪一个人在建筑物内的位置。当用户启动时,它们应该位于307房间的门口,但当我绘制它们时(由绿色圆圈指示),它们正确地放置在x轴上,但在y轴上太高。我的缩放代码或定位是否有错误?用户从x=163,y=414开始。canvas.getHeight()是否不返回我在使用
fillStart
时使用的值

我已经为MyImageView编写了以下onDraw方法,主要活动跟踪用户当前的x,y坐标:

public class MyImageView extends ImageView {
    private Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    private float scaleX, scaleY;
    private MainActivity ma;

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float x = ma.getX();
        float y = ma.getY();
        Drawable d = getResources().getDrawable(R.drawable.ist_level_3);
        scaleX = (float)  d.getIntrinsicWidth() /canvas.getWidth();
        scaleY = (float)  d.getIntrinsicHeight()/canvas.getHeight() ;
        p.setARGB(255, 0, 255, 20);
        p.setStyle(Style.FILL);

        canvas.drawCircle( (x * scaleX), (y * scaleY), 10, p);
        Log.i("MyImageView", String.format(
                "xy %.2f,%.2f Drawing %.2f,%.2f Scales %.2f, %.2f", x, y,
                (x * scaleX), (y * scaleY), scaleX, scaleY));


    }  
我在布局中使用了它,如下所示:

  <com.jonathanmackenzie.indoortracking.MyImageView
        android:id="@+id/istMap"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        android:src="@drawable/ist_level_3" 
        android:onClick="resetLocation" />

地图显示正确,如下所示:

  <com.jonathanmackenzie.indoortracking.MyImageView
        android:id="@+id/istMap"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        android:src="@drawable/ist_level_3" 
        android:onClick="resetLocation" />

您是否查看了
ImageView
对象上的
setWillNotDraw(布尔)
函数?它帮了我也许这也是你的问题

有关文件:


很明显。您忘记了Y=0在屏幕顶部。虽然您的入口很可能位于标准坐标系中,底部为0。

嗨,Jonno,我有一个关于这个室内实施的问题。您是如何管理这个圆圈的,假设如果我从lelt向右滚动此当前图像,那么您将如何管理此用户当前位置,因为它始终显示在画布上意味着如果您在右侧当前用户位置向左滚动此图像,那么您将如何处理此图像,因为此用户位置始终显示在画布上?在应用程序代码中,您需要将用户的当前位置存储为x,y坐标。然后,当它们移动时,该变量将被更新,并在扩展了Hi Jonno的类的
onDraw
方法中重新绘制其位置,在我的应用程序中,我可以从左到右或从右到左滚动地图。因此,您提供的解决方案在我的情况下不起作用,因为当用户从左到右或从右到左滚动地图时,即使用户未到达此位置,用户位置也将可见,因为通过使用onDraw API,我可以绘制圆圈,但在任何一个用户都可以看到到达或未到达该点(如果地图图像太大)。通过使用onDraw API,您无法将您的用户位置粘贴到地图图像上。感谢您宝贵的时间。