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>