(ANDROID)ImageView无法正确定位

时间:2014-08-16 18:47:41

标签: 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(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);
}

这可能会奏效,但它不会。图像在此图像中略微向右和向下放置: https://www.dropbox.com/s/tf7r1u1xqcmb9t9/2014-08-16%2018.36.04.png

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

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

这是结果: https://www.dropbox.com/s/mjw80zlzkav6dzs/2014-08-16%2018.41.16.png

旁注:消息()功能中的文字无关紧要,也不在 ImageCentered()功能中。

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

@Override
public void onWindowFocusChanged(boolean hasFocus){     
    ImageCentered(R.id.image);
}

这段代码位于我的 MainActivity.java 文件中,而 ImageCentered()函数位于我的 UtilLib.java 文件中。

所以,我想知道:这里发生了什么?当我弹出消息()时,为什么代码可以正常工作? 当然,我可以尝试对数据进行硬编码,但是更小/更大的屏幕呢?

我希望Android大师可以帮助我,因为我已经在这方面苦苦挣扎了很长时间。

修改 按下" OK"在我的消息上: https://www.dropbox.com/s/a7lu6588hy1opw7/2014-08-16%2018.51.55.png

我的猜测是我的问题就在那里,但在点击" OK"按钮再一次,数据是" 492,207"再次。 划伤头

2 个答案:

答案 0 :(得分:1)

假设你的代码是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"/>

答案 1 :(得分:0)

我最终决定只对 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)