2012/9/27 Serdel <[email protected]> > 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). >
Just 1) measure the children 2) position them. But it seems like I'm missing something. > > 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 <[email protected]> >> >> 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 <[email protected]> >>>>> >>>>>> 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.**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 [email protected] >>>>>> 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+**[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] > 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 > -- 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

