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

时间:2015-08-15 03:22:44

标签: android android-layout

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;
}

我创建的这个TerrainFactory课程

    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;
    }
}

问题是,当我实际运行它时,这就是我的日志告诉我的内容:

  • 左:界限为0
  • 右:界限为200
  • 底部:界限为150
  • 上:界限为0

如果有任何帮助,请提供视觉效果: enter image description here

另外,我认为顶部的操作栏可能与此有关,但我不太确定。

它不应该告诉我我的图像的上限是0.我回来的所有四个数字都是错的。

另外,我知道我不应该把两个问题放在一个,但我究竟如何摆脱最左边恼人的25像素边距? 我已经尝试进入dimens.xml并将所有边距设置为0dp,但它似乎无法修复它。

不确定这是否相关,但这里是PlayActivity.xml,其中一切都在发生:

<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>

更新:

似乎如果我在非嵌套ImageView中创建RelativeLayout,它会返回正确的数字,除了顶部,这可能是因为操作栏而关闭。

但是,如果我在嵌套的RelativeLayout中制作图像,我最终会得到完全错误的数字,所以我认为它可能与我的XML有关,也许?但我似乎无法弄清楚为什么它适用于非嵌套RelativeLayout,但对嵌套RelativeLayout无效。

1 个答案:

答案 0 :(得分:0)

getLeft()getRight()getBottom()getTop()返回相对于父级的值,而不是屏幕坐标。由于您将ImageView添加到RelativeLayout作为没有特殊布局参数的第一个孩子,因此它将具有(顶部,左侧)==(0,0)。

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