Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ImageView ScaleType *FIT_TOP*

I am trying to implement an ImageView with could holds both landscape or portrait images. Those images should fit the width of the imageview (if landscape) or the height (if portrait) but in any case they must be aligned to the top of the view with no margin or padding.

What I would like to achieve is something like android:scaleType="fitStart" but centered in the case of portrait images or aligned to top in case of landscape images.

Added:

Now I am using such an ugly code, which seems to work, but not sure it is the best solution:

<com.custom.layout.MyImageView 
        android:id="@+id/detail_view_image" 
        android:src="@drawable/logo" 
        android:background="#fff"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:cropToPadding="false"
        android:adjustViewBounds="false"
/>

and then in my class, that extends ImageView i do:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int imgWidth = getDrawable().getIntrinsicWidth();
        int imgHeight = getDrawable().getIntrinsicHeight();

        if(imgWidth>imgHeight)
            setScaleType(ScaleType.FIT_START);
        else
            setScaleType(ScaleType.FIT_CENTER);

        int width = measureWidth(widthMeasureSpec);
        int height = measureHeight(heightMeasureSpec);      

        setMeasuredDimension(width, height);
    }
like image 648
0m4r Avatar asked Nov 05 '22 03:11

0m4r


1 Answers

Instead of overriding native views you could just place a snippet in onCreate() method that changes the scaleType of the ImageView according to the orientation of the phone.

Some example snippet(I am not sure it works just like that but to get the idea), in onCreate method:

ImageView imgView = findViewById(R.id.myImage);
//portrairt orientation
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    imgView.setScaleType(ScaleType.FIT_CENTER);
} else { //landscape orientation
    imgView.setScaleType(ScaleType.FIT_START);
}

so when an orientation change is happening then the onCreate will be called again and change the view's scale type and if you are overriding onConfigurationChanged() then you should add the above snippet again wherever you want. Try it and let me know if it worked

like image 126
10s Avatar answered Nov 11 '22 10:11

10s