java - Why does Android draw View inside another (with width and height defined in pixels) in incorrect way? -


i wondering in way android draws views on screen inside layout views defined android:layout_width , android:layout_height values in pixels.

i using android class view extends android.view.surfaceview. mjpegview display mjpeg stream camera on android app. working code (with small changes): android ics , mjpeg using asynctask

this mjpegview class placed inside relativelayout. mjpegview object added programmatically , relativelayout has attributes defined in way:

android:layout_width="800px" android:layout_height="600px" 

this size values necessary application can't change them. application working in landscape orientation. mjpegview need set 320 x 240 pixels size inside relativelayout (800 x 600 px). application enlarges realtivelayout fill screen on current device. , problem connected streaming mjpeg. working on nexus 7 (2012 version), has 1280 x 800 resolution.

to real size of view inside layout have measured height of nexus 7 screen without action , navigation bars. have used method inside 1 activity:

@override public void onwindowfocuschanged(boolean hasfocus) {     super.onwindowfocuschanged(hasfocus);     relativelayout parentlayout = (relativelayout) findviewbyid(r.id.parent_layout);     if (parentlayout != null && islandscape) {         this.measuredactivityheight = parentlayout.getbottom();     } } 

i getting 703 value measuredactivityheight of running activity. ratio in android translates 320 x 240 px inside 800 x 600 px dp value on screen have written method:

 public int calculateforcurrentscreen(float pixelvalue) {     float ratio = pageactivity.measuredactivityheight / 600f;     int result = (int) (pixelvalue * ratio);     return result; } 

so 320 x 240 px on nexus 7 getting 374 x 281. , mjpegview in size need use method inside mjpegview class:

public void setresolution(int width, int height) {     holder.setfixedsize(width, height); } 

and size of streaming view in wanted size. view has additional black areas. in fact whole view (camera stream + black areas on bottom , right side) has 440 x 328 size.

i have checked rect object in mjpegview drawing 374 x 281 size ok. surfaceholder , canvas have size. bitmap object has 320 x 240 size, ok because bitmap object camera stream. , resized wanted size.

problem disappear (there no black areas , mjpegview in correct position , size relative other views) when have switched relativelayout 800dp x 600dp size , invoke setresolution(320, 240) mjpegview object. whole layout in moment big.

edit

thanks @mathiash comment. have uploaded screenshot nexus 7 (2012 edition) show problem.

as can see, green area relativelayout defined 800 x 600 px size. mjpeg stream http://trackfield.webcam.oregonstate.edu/. have used url: http://trackfield.webcam.oregonstate.edu/axis-cgi/mjpg/video.cgi?resolution=320x240.

for screenshot have invoked setresolution(320, 240) method. , black area has 374 x 281 , video stream 320 x 240.

320x240

for screenshot have invoked setresolution(374, 281) method. , black area bigger , video stream 374 x 281. , in case video stream has correct size black area unnecessary.

374x281

as levente kurusa suggested, using virtual pixel unit such dp may solve problem. should avoid using px diretly.


Comments

Popular posts from this blog

database - VFP Grid + SQL server 2008 - grid not showing correctly -

jquery - Set jPicker field to empty value -

.htaccess - htaccess convert request to clean url and add slash at the end of the url -