"onMeasure may be called multiple times, yes." but why once with 480x817(so almost full screen) and 2nd time with 227x481 (the actual size that I want). Moreover I have noticed that it is called multiple times but always with this pair - first with almost fullscreen, 2nd correct. How can I filter to use only the 2nd one? I don't know the exact values that android can scale my image to.
W dniu czwartek, 27 września 2012 11:23:16 UTC+2 użytkownik Kostya Vasilyev napisał: > > You're calling findViewById() on your image view object, which looks among > the view's children. Since the progress bar is not a child of your image > view, this returns null. Look in the activity instead, or have the activity > provide the progress bar to the image view, or -- that's how I'd do it -- > create a layout class that manages both image and progress views as its > children. > > onMeasure may be called multiple times, yes. > > -- K > > 2012/9/27 Serdel <[email protected] <javascript:>> > >> Hi Kostya, >> >> I am not sure what is complicated here... I just want to place my >> progress bar in the exact location on my imageview. If do it 'hard coded' >> so i.e. the image is 200x400 and I place it 50px from left and 100px from >> bottom than it will be misplaced if the image is resized by android. >> Therefore I want to get new resized parameters so I can calculate my >> position dynamically not hard coded - it cannot be put more simple. I ahve >> now subclassed my ImageView on in the onMeasure I finally got the rescaled >> size. However inside that method I get null when I call: >> >> myCustomTwistedProgressBar = ((CustomTwistedProgressBar) >> findViewById(R.id.progressBar)) >> >> Moreover I also need to get the screen density before placing my progress >> bar (I have different image sizes for different densities). So I am still >> stuck. I don't understand why is it soooooo difficult to get the rescaled >> dimensions of an imageView in android. >> >> >> Also one very strange thing is that my onMeasure is called a couple of >> times when the activity starts - first it seems that the image is spread >> (width and height are full screen values) and the 2nd time they are correct. >> >> >> W dniu środa, 26 września 2012 23:46:37 UTC+2 użytkownik Kostya Vasilyev >> napisał: >>> >>> Not sure what your requirements are, but the code below seems way too >>> complicated to me. >>> >>> Subclass ViewGroup, draw the image in onDraw, override onMeasure / >>> onLayout and position the progress bar (or skip the drawing and add an >>> image view as a child... you'd need to position it too...) >>> >>> -- K >>> >>> 2012/9/26 Serdel <[email protected]> >>> >>>> The problem with properly handling multiple screen sizes on Android >>>> has been talked all over thousands of times. However I couldn't find a >>>> solution to m problem. In a nutshell I need to align my custom progress >>>> bar >>>> over an imageView. I've got 3 set of drawables for the imageView - >>>> ldpi(scaled for 240x400), mdpi(scaled for 320x480), hdpi(scaled for >>>> 480x800). I align my custom view in Java with the following code: >>>> >>>> //get screen density >>>> float density = >>>> getBaseContext().getResources(**).getDisplayMetrics().density; >>>> >>>> >>>> //set the progress bar position according to screen density >>>> if ( density == 1.0f) >>>> >>>> >>>> { >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> // Get current dimensions >>>> int width = bitmap.getWidth(); >>>> >>>> >>>> int height = bitmap.getHeight(); >>>> >>>> LayoutParams params = new LayoutParams((int)(height/13.**94), >>>> (int)(height/13.94)); >>>> >>>> >>>> params.setMargins((int)(width/**2.30), 0, 0, >>>> (int)(height/2.75)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> }else if ( density == 1.5f ){ >>>> >>>> >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> int width = bitmap.getWidth(); >>>> int height = bitmap.getHeight(); >>>> >>>> >>>> LayoutParams params = new >>>> LayoutParams((int)Math.round(h**eight/14.13), >>>> (int)Math.round(height/14.13))**; >>>> >>>> >>>> params.setMargins((int)Math.ro**und( width/2.27), 0, 0, >>>> (int)Math.round(height/2.91)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> }else if ( density == 0.75f ){ >>>> >>>> >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> // Get current dimensions >>>> int width = bitmap.getWidth(); >>>> >>>> >>>> int height = bitmap.getHeight(); >>>> >>>> LayoutParams params = new LayoutParams((int)(height/14.**88), >>>> (int)(height/14.88)); >>>> >>>> >>>> params.setMargins((int)(width/**2.27), 0, 0, >>>> (int)(height/2.69)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> } >>>> >>>> >>>> The problem with properly handling multiple screen sizes on Android >>>> has been talked all over thousands of times. However I couldn't find a >>>> solution to m problem. In a nutshell I need to align my custom progress >>>> bar >>>> over an imageView. I've got 3 set of drawables for the imageView - >>>> ldpi(240x400), mdpi(320x480), hdpi(480x800). I align my custom view in >>>> Java >>>> with the following code: >>>> >>>> //get screen density >>>> float density = >>>> getBaseContext().getResources(**).getDisplayMetrics().density; >>>> >>>> >>>> //set the progress bar position according to screen density >>>> if ( density == 1.0f) >>>> >>>> >>>> { >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> // Get current dimensions >>>> int width = bitmap.getWidth(); >>>> >>>> >>>> int height = bitmap.getHeight(); >>>> >>>> LayoutParams params = new LayoutParams((int)(height/13.**94), >>>> (int)(height/13.94)); >>>> >>>> >>>> params.setMargins((int)(width/**2.30), 0, 0, >>>> (int)(height/2.75)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> }else if ( density == 1.5f ){ >>>> >>>> >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> int width = bitmap.getWidth(); >>>> int height = bitmap.getHeight(); >>>> >>>> >>>> LayoutParams params = new >>>> LayoutParams((int)Math.round(h**eight/14.13), >>>> (int)Math.round(height/14.13))**; >>>> >>>> >>>> params.setMargins((int)Math.ro**und( width/2.27), 0, 0, >>>> (int)Math.round(height/2.91)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> }else if ( density == 0.75f ){ >>>> >>>> >>>> ImageView micImage = ((ImageView) >>>> findViewById(R.id.imageViewClk**)); >>>> >>>> >>>> Drawable drawing = micImage.getDrawable(); >>>> Bitmap bitmap = ((BitmapDrawable)drawing).getB**itmap(); >>>> >>>> >>>> // Get current dimensions >>>> int width = bitmap.getWidth(); >>>> >>>> >>>> int height = bitmap.getHeight(); >>>> >>>> LayoutParams params = new LayoutParams((int)(height/14.**88), >>>> (int)(height/14.88)); >>>> >>>> >>>> params.setMargins((int)(width/**2.27), 0, 0, >>>> (int)(height/2.69)); >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_LEFT,R.id.imageViewClk); >>>> >>>> >>>> >>>> params.addRule(RelativeLayout.**ALIGN_BOTTOM,R.id.imageViewClk**); >>>> >>>> >>>> myCustomTwistedProgressBar.set**LayoutParams(params); >>>> } >>>> >>>> Everything worked fined on different screen sizes however when I tried >>>> to check on 480x854 resolution the vertical alignment of the custom view >>>> was incorrect. Checked with 480x800 on the same screen size and it again >>>> works. I than went for a big jump and checked in GalaxyTab and the >>>> horizontal and vertical alignments were wrong. Now my first though was >>>> that >>>> the bitmap width and height were the one of the image not the actual >>>> resized imageview. So I spent a lot of time on trying to get the real size >>>> of the imageview and even went for viewTreeObserver but the results were >>>> all the same - the correct, unchanged (unscaled?) bitmap size. So being >>>> positive that the problem is not here I couldn't get through further. I >>>> see >>>> 2 options here: >>>> >>>> -either I still can't get the true 'real' size of the imageview >>>> (although I think I have ruled this out by checking the size by adding >>>> listeners to biewTreeObserver) >>>> -or, although I get the right size and calculate the alignment >>>> parameters correctly, they are somehow 'incorrectly' (differently) used in >>>> the layout. >>>> >>>> >>>> Does anyone have an idea why the alignment is not working correctly? >>>> >>>> PS: as for the image view in layout xml file I have 2 configurations >>>> for long and notlong but this image has the same description in both: >>>> >>>> <ImageView >>>> android:src="@drawable/**cloking" >>>> >>>> >>>> android:id="@+id/**imageViewClk" >>>> android:layout_height="wrap_**content" >>>> android:layout_width="wrap_**content" >>>> >>>> >>>> android:layout_**centerHorizontal="true" >>>> android:layout_above="@+id/**imageViewProcess" >>>> >>>> android:adjustViewBounds="**true" >>>> >>>> android:cropToPadding="false" >>>> android:layout_marginTop="**60dp" >>>> android:scaleType="fitXY"> >>>> >>>> </ImageView> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Android Developers" group. >>>> To post to this group, send email to android-d...@**googlegroups.com >>>> >>>> To unsubscribe from this group, send email to >>>> android-developers+**[email protected] >>>> For more options, visit this group at >>>> http://groups.google.com/**group/android-developers?hl=en<http://groups.google.com/group/android-developers?hl=en> >>>> >>> >>> -- >> You received this message because you are subscribed to the Google >> Groups "Android Developers" group. >> To post to this group, send email to >> [email protected]<javascript:> >> To unsubscribe from this group, send email to >> [email protected] <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/android-developers?hl=en >> > > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

