In both onMeasure, onLayout of these when I set the Layout params to the progress bar they seem to be ignored (the bar is not displayed at all).
skink: your code works but the matrix seems calculate the points before resizing the image. On Thursday, September 27, 2012 12:22:22 PM UTC+2, Kostya Vasilyev wrote: > > Yes, there are methods for measuring and positioning views. They are > called onMeasure and onLayout, respectively... > > 2012/9/27 Serdel <adam.lich...@gmail.com <javascript:>> > >> I passed my progress bar object to my ImageView subclass but if I set the >> layout params on the progress bar object they are not accepted (it is not >> displayed at all). Of course in the xml file my custom image view is under >> the progress bar so it is not covering it. So even If I do get the correct >> resized parameters I can't use them to position my progress bar. Is there a >> method in the main UI thread or inside my ImageView subclass that I can use >> for that purpose? >> >> >> On Thursday, September 27, 2012 11:26:49 AM UTC+2, Serdel wrote: >>> >>> >>> "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 <adam.lich...@gmail.com> >>>> >>>>> 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 <adam.lich...@gmail.com> >>>>>> >>>>>>> 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.**9**4), (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.**8**8), (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.**9**4), (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.**8**8), (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/**clokin**g" >>>>>>> >>>>>>> >>>>>>> >>>>>>> android:id="@+id/**imageViewClk**" >>>>>>> android:layout_height="wrap_**c**ontent" >>>>>>> >>>>>>> android:layout_width="wrap_**co**ntent" >>>>>>> >>>>>>> >>>>>>> android:layout_**centerHorizont**al="true" >>>>>>> android:layout_above="@+id/**im**ageViewProcess" >>>>>>> >>>>>>> >>>>>>> android:adjustViewBounds="**tru**e" >>>>>>> >>>>>>> android:cropToPadding="false" >>>>>>> android:layout_marginTop="**60d**p" >>>>>>> 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+**unsubscribe**@googlegroups.com >>>>>>> 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 android-d...@googlegroups.com >>>>> To unsubscribe from this group, send email to >>>>> android-developers+**unsubscr...@googlegroups.com >>>>> 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 >> android-d...@googlegroups.com<javascript:> >> To unsubscribe from this group, send email to >> android-developers+unsubscr...@googlegroups.com <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 android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en