I have created an activity with a header image. This header image is originally created int the Activity's layout xml using an ImageView where the scaleType is set to centerCrop. This does what I want, it centers the image, clipping it left and right in portrait mode, showing all in landscape mode.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="30dp" android:paddingBottom="6dp" android:paddingLeft="6dp" android:paddingRight="6dp" android:background="#919EAC" android:orientation="vertical" > <ImageView android:id="@+id/header_image" android:layout_width="match_parent" android:layout_height="120dp" android:contentDescription="@string/header_description" android:scaleType="centerCrop" android:src="@drawable/header" /> .... <other views> ...
I'd like to replace this with a background drawable so that I can use the header image space to display data, and it saves me repeating the same layout in the different activities.
For this reason I have created a drawable that I can refer to in the android:background attribute:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle" > <solid android:color="#919EAC" /> </shape> </item> <item> <bitmap android:antialias="true" android:gravity="top|center_horizontal" android:src="@drawable/header" /> </item> </layer-list>
This drawable defines the colored background that otherwise the layout would define and it defines a header image that otherwise would be included in the layout as an ImageView.
However now my image is scaled, while I would like it to be cropped.
Checking the Android documentation I tried other gravity modes such as
android:gravity="top|clip_horizontal"
But it still seems to display/scale differently than the image view.
What would be the correct definition of the background drawable?
android.graphics.drawable.BitmapDrawable. A Drawable that wraps a bitmap and can be tiled, stretched, or aligned. You can create a BitmapDrawable from a file path, an input stream, through XML inflation, or from a Bitmap object. It can be defined in an XML file with the <bitmap> element.
android:scaleType. Controls how the image should be resized or moved to match the size of this ImageView. android:src. Sets a drawable as the content of this ImageView. android:tint.
To center crop a bitmap in code do this:
public static Bitmap cropCenter(Bitmap bmp) { int dimension = Math.min(bmp.getWidth(), bmp.getHeight()); return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension); }
I don't know of any other way to centerCrop a bitmap xml wise.
Hope it helps anyone.
I found this solution from this post: Android Crop Center of Bitmap
I solved this problem with a decorator which maintains the aspect ratio of the underlying drawable: https://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e
Unfortunately, there is no way to apply it from XML so I do that at the very beginning of my splash Activity:
public class SplashActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Drawable bg = getResources().getDrawable(R.drawable.screen); getWindow().setBackgroundDrawable(new CenterCropDrawable(bg)); ... } }
That is roughly equivalent to specifying the drawable as android:windowBackground
in the Activity theme
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With