2013-10-18 6 views
1

선형 레이아웃 (width = fill parent, 기본적으로 장치의 전체 너비를 채 웁니다.)에는 2 개의 하위 레이아웃이 포함되어 있습니다. 하나의 선형 레이아웃 (width1 = fill_parent)을 사용하고 두 번째 선형은 width = fill_parent 인 webview입니다. 기본적으로 webview는 visibility = GONE으로 정의되므로 화면에 표시되지 않으며 공간을 차지하지 않습니다.안드로이드 createbitmap 너비는 다른 장치에서 다르게 동작합니다.

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

는 I, 프로그램은 선형으로 배치 linear1 표면 뷰로드 웹보기 사라 = 공개 남아있다. 표면보기는 모든 장치에서 전화의 전체 너비를 차지하지만 아무런 문제가 없습니다. 이제 일정한 조건에서 프로그램 적으로 linear1 (가시성 = 사라짐)을 숨기고 캔버스를 사용하여 createbitmap/write를 사용하여 새 비트 맵을 작성한 다음 파일로 작성한 다음 webview에로드하고 webview를 표시합니다. 비트 맵에서 장치의 전체 너비를 사용하려면 (더 이상은 아니지만), 내가하는 일은 getwidth를 사용하여 숨기기 전에 linear1의 너비를 찾는 것입니다. 올바른 값을 얻으면 0이 아닙니다. 내가 만드는 비트 맵의 ​​너비로 설정합니다.

비트 맵이 아무런 문제없이 생성되었으므로 파일로 장치에 쓴 다음 파일 시스템에서 webview로로드되고 모든 것이 훌륭합니다. HTC Inspire에서 동작하는 방식을 정확하게 동작합니다 (andriod 2.3 생각 ...). 비트 맵/webview는 장치의 전체 너비를 차지하며 비트 맵의 ​​크기는 linear1의 너비와 동일합니다. 하지만 HTC One MIni (안드로이드 4.2.2)에서이를 테스트 할 때 비트 맵 너비가 장치 너비와 linear1 너비보다 훨씬 큽니다. 원래는 linear1 너비를 사용하여 비트 맵을 만들었지 만 장치의 전체 너비를 차지합니다. 내가 Kindle FIRE (불의 첫 번째 버전)에서 테스트 할 때 비트 맵의 ​​너비가 linear1의 너비보다 작습니다. 기본적으로 HTC Inspire에서는 예상대로 작동하지만 HTC One Mini 및 KIndle Fire에서는 다르게 작동합니다. 나는 다른 장치에서 테스트하지 않았다.

분명히 밝혀야 할 것은 조정할 수있는 webview의 확대/축소를 말하는 것이 아니며 내가 언급 한 문제는 비트 맵의 ​​크기입니다. 이것은 각 장치의 해상도, 핀치 당 픽셀 수 등과 관련이있을 수 있습니다. 그러나 실제로 이해할 수없는 것은 비트 맵의 ​​너비를 설정하기 위해 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

에 의해 그 금액을 곱하여

보십시오. 코드를 게시하는 것이 좋습니다. 기억하십시오 : "코드가 말보다 더 크게 말합니다" –

+0

그게 내가 생각하는 것입니다. 지금 코드 스 니펫을 추가했습니다. –

+0

WebView 대신 ImageView를 사용할 수 있습니까? 하드 코드 된 600 높이 때문입니다. 나는 당신이'yourWebView.setInitialScale (100);을 시도 할 것을 조언하겠다. –

답변

2

나는 이러한 밀도에 장치 밀도를 곱해야한다고 생각합니다. 그것은 어떻게 든 장치의 DP 관련이 내가 무엇을 밖으로 만들 수에서

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

실제로 밀도로 나누면 HTC mini에서 작동합니다. HTC mini에서 밀도는 2이고 레이아웃의 너비를 밀도로 나누면 작동합니다. 레이아웃 크기가 정확한 비트 맵을 제공합니다. 그러나 밀도가 1.5 인 HTC Inspire에서는 분할보다 폭이 작은 비트 맵을 제공합니다. 빛나다 화재 밀도가 1이므로 나누기 후 변경 사항이없고 비트 맵 레이아웃보다 작습니다. –

+0

@ saj- 그리고 double 타입으로 곱셈/나눗셈을하거나 캐스팅하여 연산자 나 결과를 두 배로 늘리고 있습니까? 마지막으로 결과를 정수로 다시 캐스팅해야합니다 (픽셀은 정수이므로 ...). – David

+0

예, 저는 int로 캐스팅합니다. 이것은 내가 가지고있는 것입니다. \t \t \t int width = layout.getWidth();\t \t width = (int) (width/displaymetrics.density);'Galaxy s4에서도 테스트했습니다. 레이아웃의 너비가 같으면 레이아웃보다 비트 맵이 훨씬 큽니다. 밀도로 나누면 비트 맵이됩니다. 레이아웃보다 작습니다. 기본적으로 안드로이드의 동일한 버전의 경우에도 장치간에 일관성이 없습니다. –

관련 문제