Android (安卓)ImageView赢得';t定位正确

Android (安卓)ImageView赢得';t定位正确,android,imageview,Android,Imageview,我有一个与Android相关的问题: 我试图在我的设备屏幕上居中放置一个徽标,但它无法正确定位。 我正在使用以下功能: public void ImageCentered(int ID){ ImageView iv = (ImageView) findViewById(ID); int x = 0; int y = 0; RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(

我有一个与Android相关的问题: 我试图在我的设备屏幕上居中放置一个徽标,但它无法正确定位。 我正在使用以下功能:

public void ImageCentered(int ID){
    ImageView iv = (ImageView) findViewById(ID);
    int x = 0;
    int y = 0;

    RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    x = (screenWidth/2)-(iv.getWidth()/2);
    y = (screenHeight/2)-(iv.getHeight()/2);
    position.setMargins(x, y, 0, 0);

    iv.setLayoutParams(position);
}
这可能会奏效,但不会。图像稍微向右和向下偏移,如下图所示:

现在,奇怪的是,当我使用以下代码时:

public void ImageCentered(int ID){
    ImageView iv = (ImageView) findViewById(ID);
    int x = 0;
    int y = 0;

    RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    x = (screenWidth/2)-(iv.getWidth()/2);
    y = (screenHeight/2)-(iv.getHeight()/2);
    position.setMargins(x, y, 0, 0);
    Message(IntToStr(x)+", "+IntToStr(y));

    iv.setLayoutParams(position);
}
结果是:

旁注:Message()函数中的文本无关紧要,它在ImageCentered()函数中的位置也无关紧要

我没有在OnCreate()中调用函数,因为图像的宽度和高度总是返回0,所以我查找了一些内容,发现如下:

@Override
public void onWindowFocusChanged(boolean hasFocus){     
    ImageCentered(R.id.image);
}
这段代码在我的MainActivity.java文件中,而ImageCentered()函数在我的UtilLib.java文件中

所以,我想知道:这里发生了什么?为什么当我弹出一条消息()时,代码可以工作,而当我将其忽略时,代码却不能工作? 当然,我可以尝试硬编码数据,但是小屏幕/大屏幕呢

我希望安卓大师能在这里帮助我,因为我已经为此奋斗了很长一段时间

编辑 在我的留言上按“OK”时,我注意到了一些有趣的事情:


我的猜测是,我的问题就在那里,但再次单击“确定”按钮后,数据又是“492207”。划伤头部

我最终决定硬编码x和y坐标,然后使用某种缩放转换来正确定位它们,除非有人能为我提供更好的修复方法

更新 因此,在谷歌搜索了一段时间后(再次),我终于找到了答案并创建了两个函数:

public int GetImageHeight(int ID){
    ImageView iv = (ImageView)findViewById(ID);
    iv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
               MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    iv.layout(0, 0, iv.getMeasuredWidth(), iv.getMeasuredHeight());

    return iv.getMeasuredHeight();
}
public int GetImageWidth(int ID){
    ImageView iv = (ImageView)findViewById(ID);
    iv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
               MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    iv.layout(0, 0, iv.getMeasuredWidth(), iv.getMeasuredHeight());

    return iv.getMeasuredWidth();
}
您只需传递在xml文件中创建的图像的ID,如下所示:

GetImageHeight(R.id.logo)

假设您的代码中ImageView位于RelativeLayout内,您还可以执行以下操作:

// get imageview layout params or create new ones
RelativeLayout.LayoutParams params = imageView.getLayoutParams();

params.addRule(RelativeLayout.CENTER_HORIZONTAL);
这样,图像将自动居中,而无需所有手动计算

您还可以使用在XML中指定它

 <ImageView .....
  android:layout_centerHorizontal="true"/>


对于完全居中的图像,这将是一个更好的解决方案。然而,我的应用程序(游戏)将需要我发布的这些计算的宽度和高度。嗯,好吧,我还以为发生了其他事情,太多的计算只需要将图像居中&忘了它!