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 [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