2013-10-18 71 views
1

我有一个线性布局(width = fill parent,基本上它填充了设备的整个宽度),它包含2个子布局。一个linearlayout(我们称之为linear1),width = fill_parent,第二个是width = fill_parent的webview。默认情况下,webview是通过visibility = GONE定义的,所以它不会显示在屏幕上,它不占用任何空间。Android的createbitmap宽度在不同的设备上表现不同

<ParentLinear> <Linear1 width=fill_parent></Linear1> <Webview width=fill_parent></Webview> </ParentLinear>

予编程加载一个表面视图入线性布局linear1和web视图仍然能见度=不见了。表面视图占用了所有设备上手机的全部宽度,在那里没有问题。现在,在某些情况下,我以编程方式隐藏了linear1(visibility = gone),并使用canvas创建了一个使用createbitmap/write的新位图,将其作为文件编写,然后将其加载到webview中并使webview可见。为了使位图只使用设备的整个宽度,不多也不少,我所做的是在使用getwidth隐藏之前找到linear1的宽度(并且我得到正确的值,它不是0),然后我将其设置为我创建的位图的宽度。

现在,位图创建时没有问题,我将它作为文件写入设备,然后从文件系统将其加载到webview中,并且都很好,并且很花哨。它的行为正是我想要它在HTC Inspire上运行的(Andriod 2.3我认为...),位图/ web视图占据了设备的整个宽度,位图的大小与linear1的宽度完全相同。但是当我在HTC One MIni(android 4.2.2)上测试这个时,位图的宽度比设备的宽度和linear1的宽度大得多,尽管我最初使用linear1的宽度创建了位图占据设备的整个宽度。当我在Kindle FIre(kindle fire的第一个版本)上测试它时,位图的宽度小于linear1的宽度。基本上按照HTC Inspire的预期工作,但在HTC One Mini和KIndle Fire上有所不同。我没有在任何其他设备上测试过。

只是要清楚,我不是指我知道可以调整的web视图的缩放比例,我指的是位图的大小。这可能与每个设备的分辨率,每个设备的像素等有关,但是我不明白的是因为我实际上使用了linear1的宽度来设置位图的宽度,那么为什么它不是确切的相同。还有一件事,如果我在位图上做一个getwidth,我得到的数字与linear1相同,但是在屏幕上它们不匹配,位图明显变大或变小。请让我知道,如果你可以给我一些指示,了解这是如何工作的。

以下是我认为相关的代码部分。

int bitmapX = linear1.getWidth() //this is the value under question 
    int bitmapY = 600; // will need to convert from dip to pixel later 
    Bitmap myBitMap = Bitmap.createBitmap(bitmapX, bitmapY, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(myBitMap); 

-- there is other code which is not shown here to write stuff into the bitmap using canvas -- 

    canvas.save(); 
    canvas.translate(
    myBitMap.getWidth()/2 , 
    myBitMap.getHeight()/2); 
    canvas.restore(); 
    writeBitmap(myBitMap); //writes the bitmap to a file calling a user defined function. 
    myBitMap.recycle(); 
+0

这些金额乘以从我可以辨认出它是某种相关设备的DP。我会建议你发布你的代码。请记住:“代码说话比文字更响亮” –

+0

这就是我的想法..我现在添加了一段代码。 –

+0

您可以使用ImageView而不是WebView?这种行为绝对是因为你的硬编码高度。我会建议你尝试'yourWebView.setInitialScale(100);' –

回答

2

我认为你必须乘以这些数量的设备密度。

尝试通过

this.getResources().getDisplayMetrics().density 
+0

实际上按密度划分它使它在HTC mini中工作。在HTC mini上,密度为2,并且通过密度工程来划分布局宽度,它给了我一个确切尺寸布局的位图。但是,HTC Inspire在密度为1.5的情况下破裂,并且在分割之后,它给出了比布局更小的宽度的位图。在Kindle的火灾中,密度是1,因此分割后没有变化,位图比布局小。 –

+0

@ saj-和你正在用double类型进行乘法/除法还是将任何运算符或结果加倍?最后你必须将结果再次转换为整数(因为像素是整数...)。 – David

+0

是的,我投到int,这是我有\t \t \t'int width = layout.getWidth(); \t \t width =(int)(width/displaymetrics.density);'在Galaxy s4上测试它,如果采用相同的布局宽度,则位图比布局大得多,如果用密度除以位图比布局小。基本上,即使对于相同版本的Android,设备之间也没有一致性。 –

相关问题