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 <javascript:>>
>
>> 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).getBitmap();
>>
>>             // 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.setLayoutParams(params);
>>        }else if ( density == 1.5f ){
>>
>>            ImageView micImage = ((ImageView) 
>> findViewById(R.id.imageViewClk));
>>
>>            Drawable drawing = micImage.getDrawable();
>>             Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
>>
>>             int width = bitmap.getWidth();
>>             int height = bitmap.getHeight();
>>
>>             LayoutParams params = new 
>> LayoutParams((int)Math.round(height/14.13), (int)Math.round(height/14.13));
>>
>>             params.setMargins((int)Math.round( 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.setLayoutParams(params);
>>        }else if ( density == 0.75f ){
>>
>>            ImageView micImage = ((ImageView) 
>> findViewById(R.id.imageViewClk));
>>
>>            Drawable drawing = micImage.getDrawable();
>>             Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
>>
>>             // 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.setLayoutParams(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).getBitmap();
>>
>>             // 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.setLayoutParams(params);
>>        }else if ( density == 1.5f ){
>>
>>            ImageView micImage = ((ImageView) 
>> findViewById(R.id.imageViewClk));
>>
>>            Drawable drawing = micImage.getDrawable();
>>             Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
>>
>>             int width = bitmap.getWidth();
>>             int height = bitmap.getHeight();
>>
>>             LayoutParams params = new 
>> LayoutParams((int)Math.round(height/14.13), (int)Math.round(height/14.13));
>>
>>             params.setMargins((int)Math.round( 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.setLayoutParams(params);
>>        }else if ( density == 0.75f ){
>>
>>            ImageView micImage = ((ImageView) 
>> findViewById(R.id.imageViewClk));
>>
>>            Drawable drawing = micImage.getDrawable();
>>             Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
>>
>>             // 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.setLayoutParams(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<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

Reply via email to