Dre.Dre666
Dre.Dre666

Reputation: 887

How to delete Additional space ImageView in Android

I want use ImageView in my project, but it shows additional space in the layout. How can I remove the additional space?

This image shows the problem:

example image

XML code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.tellfa.smsbox.activities.Dialog_image_show">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:src="@drawable/cover_menu_bg" />

    </RelativeLayout>

</RelativeLayout>

I don't want use android:scaleType="centerCrop".

Upvotes: 2

Views: 218

Answers (3)

deadfish
deadfish

Reputation: 12304

For anyone looking for solution for both orientations. Here is my approach with samples:

First, my xml:

<?xml version="1.0" encoding="utf-8"?>
<com.example.michal.fillimageview.CustomLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="#f0f000"
    android:orientation="vertical">

    <com.example.michal.fillimageview.ResizableImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:adjustViewBounds="true"
        android:src="@drawable/p600_900" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/background_dark"
        android:text="Hello World!"
        android:textColor="@android:color/holo_red_dark"
        android:textSize="30sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/background_dark"
        android:text="Hello World!"
        android:textColor="@android:color/holo_red_dark"
        android:textSize="30sp" />

</com.example.michal.fillimageview.CustomLinearLayout>

Class:

public class ResizableImageView extends ImageView {

    public ResizableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable d = getDrawable();

        if (d != null) {
            // ceil not round - avoid thin vertical gaps along the left/right edges
            int width = View.MeasureSpec.getSize(widthMeasureSpec);
            int height = View.MeasureSpec.getSize(heightMeasureSpec);

            if (height > width) {//portrait
                if (d.getIntrinsicWidth() > d.getIntrinsicHeight()) {
                    height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                    setMeasuredDimension(width, height);
                } else {
                    width = (int) Math.ceil((float) height * (float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight());
                    setMeasuredDimension(width, height);
                }
            } else {//landscape
                width = (int) Math.ceil((float) height * (float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight());
                setMeasuredDimension(width, height);
            }

        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
}

Samples for specific images:

  • 600x900 portrait

enter image description here

  • 600x900 landscape

enter image description here

  • 800x600 portrait

enter image description here

  • 800x600 landscape

enter image description here

Upvotes: 0

Bhargav Thanki
Bhargav Thanki

Reputation: 4954

Try this custom ImageView class

public class ResizableImageView extends ImageView {

    public ResizableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        Drawable d = getDrawable();

        if(d!=null){
            // ceil not round - avoid thin vertical gaps along the left/right edges
            int width = View.MeasureSpec.getSize(widthMeasureSpec);
            int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
            setMeasuredDimension(width, height);
        }else{
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

}

And use this class as below

<your_package.ResizableImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:src="@drawable/cover_menu_bg" />

Upvotes: 1

Ravindra Kushwaha
Ravindra Kushwaha

Reputation: 8042

Use the imageview like these

<ImageView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:adjustViewBounds="true"
   android:src="@drawable/icon"
   android:id="@+id/imv"
   android:scaleType="fitCenter" />

Upvotes: 1

Related Questions