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.**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]
>>> 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

Reply via email to