Android ImageView正在返回其边界的所有错误值

Android ImageView正在返回其边界的所有错误值,android,android-layout,Android,Android Layout,这是我创建的TerrainFactoryclass I public class Terrain { public Bitmap tile; public InputStream is; public ObjectAnimator moveLeft; public Drawable tileDrawable; public Rect bounds; public ImageView terrainImage; public int to

这是我创建的
TerrainFactory
class I

public class Terrain {

    public Bitmap tile;
    public InputStream is;
    public ObjectAnimator moveLeft;
    public Drawable tileDrawable;
    public Rect bounds;
    public ImageView terrainImage;

    public int top = 0;
    public int bottom = 0;
    public int left = 0;
    public int right = 0;
}
更新:

似乎如果我在非嵌套的
RelativeLayout
中创建
图像视图
,它会返回正确的数字,除了顶部,顶部可能由于操作栏而关闭

但是,如果我在嵌套的
RelativeLayout
中生成一个图像,我最终会得到完全错误的数字,因此我假设它可能与我的XML有关,也许?但我似乎不明白为什么它适用于非嵌套的
相对论
,但不适用于嵌套的
相对论
getLeft()
getRight()
getBottom()
getTop()
返回相对于父对象的值,而不是屏幕坐标。由于要将
ImageView
添加到
RelativeLayout
中,作为没有特殊布局参数的第一个子项,因此它将具有(顶部,左侧)=(0,0)

对于额外的25像素,您可以在布局上放置一些彩色背景,以查看它们的范围;或者您可以使用ddms检查布局转储。我怀疑这是你主题的一部分。开始在布局中将边距和填充设置为0,以查看是否存在这种情况。
getLeft()
getRight()
getBottom()
getTop()
返回相对于父级的值,而不是屏幕坐标。由于要将
ImageView
添加到
RelativeLayout
中,作为没有特殊布局参数的第一个子项,因此它将具有(顶部,左侧)=(0,0)


对于额外的25像素,您可以在布局上放置一些彩色背景,以查看它们的范围;或者您可以使用ddms检查布局转储。我怀疑这是你主题的一部分。开始在布局中将页边距和填充设置为0,以查看是否存在这种情况。

那么,如何获取相对于屏幕坐标的ImageView的getLeft()、getRight()、getBottom()和getTop()?此外,我正在使用默认主题。如果理解正确,请尝试查看,这应该给我图像的左上角坐标。但是我只有左侧的X坐标,和顶部的Y坐标。我怎么才能得到右边的X坐标和底部的Y坐标呢?我们现在讨论的只是一个三角形,对吗?例如,您可以使用startX+getWidth()来查找bottomX,使用startY+getHeight()来查找bottomY。那么,如何获取图像视图相对于其屏幕坐标的getLeft()、getRight()、getBottom()和getTop()?另外,我使用的是默认主题。如果理解正确,请尝试查看,这应该给我图像的左上角坐标。但是我只有左侧的X坐标,和顶部的Y坐标。我怎么才能得到右边的X坐标和底部的Y坐标呢?我们现在讨论的只是一个三角形,对吗?例如,可以使用startX+getWidth()查找bottomX,使用startY+getHeight()查找bottomY。
    public class TerrainFactory {

    public Terrain createNewTerrain(Activity activity, RelativeLayout relativeLayout,
                                            final ArrayList<Terrain> terrainArrayList){

        terrain = new Terrain();
        terrain.is = activity.getResources().openRawResource(+R.drawable.game_tile);
        terrain.tile = BitmapFactory.decodeStream(terrain.is);
        terrain.tileDrawable = new BitmapDrawable(activity.getResources(), terrain.tile);
        terrain.terrainImage = new ImageView(activity);
        terrain.terrainImage.setImageDrawable(terrain.tileDrawable);
        relativeLayout.addView(terrain.terrainImage);

        terrain.terrainImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            public void onGlobalLayout() {

                terrain.left = terrain.terrainImage.getLeft();
                terrain.right = terrain.terrainImage.getRight();
                terrain.bottom = terrain.terrainImage.getBottom();
                terrain.top = terrain.terrainImage.getTop();

                Log.d("Left ", "Bounds are " + terrain.left);
                Log.d("Right ", "Bounds are " + terrain.right);
                Log.d("Bottom ", "Bounds are " + terrain.bottom);
                Log.d("Top ", "Bounds are " + terrain.top);
                terrain.terrainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
        return terrain;
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wordpress.somegame.runrun.activity.PlayActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:id="@+id/relativeLayout"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        ></RelativeLayout>

</RelativeLayout>