为什么布局设置为match_parent,显示0宽度

时间:2014-01-30 18:51:58

标签: android xml android-bitmap

我有以下代码:

llColors = (LinearLayout) findViewById(R.id.llColorSpect);
    llColors.setOnTouchListener(llTouch);

    width = llColors.getWidth();
    height = llColors.getHeight();

    Log.i("LAYOUT WIDTH", "width" +width); //shows 0
    Log.i("LAYOUT HEIGHT", "height" +h); //shows the correct height

让我感到困惑的是LAYOUT WIDTH为什么是0.在XML中,我将布局宽度设置为match_parent,将高度设置为wrap_content

如何使用我在下面解码的Bitmap并填写宽度fill_parent上方的布局?我使用LayoutParams吗?

bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.palette2);

XML代码是这样的:

<LinearLayout
    android:id="@+id/llColorSpect"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/palette2"
    android:layout_alignParentBottom="true" >
</LinearLayout>

我想要完成的是雷曼术语,采用布局并用背景图像填充它并使用像素来获得X和Y坐标。

2 个答案:

答案 0 :(得分:1)

您过早地致电getWidth()。用户界面尚未调整大小并在屏幕上显示。

在覆盖onWindowFocusChanged()函数后尝试获取大小:

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  //Here you can get the size!
 }

看看这个discussion

如果您希望您的位图与父高度和宽度匹配,您可以使用:

LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
imageView.setImageBitmap(bitmap);
imageView.setLayoutParams(params);

希望这会有所帮助:)

答案 1 :(得分:1)

至于width为0,layout可能尚未完成绘制。我使用OnGlobalLayoutListener知道它何时被绘制。这里有一些代码,我是如何使layout成为Bitmap所以我可以打印出来的。有点不同但相同的概念。

@Override 
public void onGlobalLayout() 
{
    String path = null;
        try {
            path = Environment.getExternalStorageDirectory().getPath().toString();
            FileOutputStream out = new FileOutputStream(path + "/testPrint" + "0" + ".png");
            Bitmap bm = Bitmap.createBitmap(root.getDrawingCache(), 0, 0, 
                    root.getWidth(), root.getHeight());                             
            bm.compress(Bitmap.CompressFormat.PNG, 90, out);                
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

其中root是我需要获得layout的{​​{1}}。

您可以将width设置为

listener

OnGlobalLayoutListener Docs