user2111639
user2111639

Reputation: 297

To bring an image to the right or left of an ImageView

I want to bring an image to the right or left of an ImageView in LinearLayout but the image is always in the center of ImageView.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="10dp">
        <ImageView
            android:id="@+id/imageView1"
            android:src="@drawable/rabbit"
            android:layout_width="190dp"
            android:layout_height="190dp"
            android:layout_gravity="center"
            android:gravity="right" />
    </LinearLayout>
</LinearLayout>

Upvotes: 0

Views: 373

Answers (2)

Son Truong
Son Truong

Reputation: 14173

Background

Here is an ImageView and each position that you want to put the actual image inside it.

enter image description here

Step 1. Add android:scaleType="matrix" to ImageView

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="190dp"
    android:layout_height="190dp"
    android:layout_gravity="center"
    android:scaleType="matrix"
    android:src="@drawable/rabbit" />

Step 2. Create an enum class that represents each position inside the ImageView.

enum ImageViewGravity {
    TOP_LEFT,
    TOP_CENTER,
    TOP_RIGHT,
    MIDDLE_LEFT,
    CENTER,
    MIDDLE_RIGHT,
    BOTTOM_LEFT,
    BOTTOM_CENTER,
    BOTTOM_RIGHT
}

Step 3. Create a method that receives 2 params, an ImageView and an ImageViewGravity

public void setImageViewGravity(ImageView imageView, @NonNull ImageViewGravity gravity) {
    imageView.post(new Runnable() {
        @Override
        public void run() {
            int imageViewWidth = imageView.getWidth();
            int imageViewHeight = imageView.getHeight();
            int actualImageWidth = imageView.getDrawable().getIntrinsicWidth();
            int actualImageHeight = imageView.getDrawable().getIntrinsicHeight();

            int dx = 0;
            int dy = 0;
            switch (gravity) {
                case TOP_LEFT:
                    dx = 0;
                    dy = 0;
                    break;
                case TOP_CENTER:
                    dx = (imageViewWidth - actualImageWidth) / 2;
                    break;
                case TOP_RIGHT:
                    dx = imageViewWidth - actualImageWidth;
                    break;
                case MIDDLE_LEFT:
                    dy = (imageViewHeight - actualImageHeight) / 2;
                    break;
                case CENTER:
                    dx = (imageViewWidth - actualImageWidth) / 2;
                    dy = (imageViewHeight - actualImageHeight) / 2;
                    break;
                case MIDDLE_RIGHT:
                    dx = imageViewWidth - actualImageWidth;
                    dy = (imageViewHeight - actualImageHeight) / 2;
                    break;
                case BOTTOM_LEFT:
                    dy = imageViewHeight - actualImageHeight;
                    break;
                case BOTTOM_CENTER:
                    dx = (imageViewWidth - actualImageWidth) / 2;
                    dy = imageViewHeight - actualImageHeight;
                    break;
                case BOTTOM_RIGHT:
                    dx = imageViewWidth - actualImageWidth;
                    dy = imageViewHeight - actualImageHeight;
                    break;
            }

            Matrix matrix = new Matrix();
            matrix.setTranslate(dx, dy);

            imageView.setImageMatrix(matrix);
        }
    });
}

Step 4. Use from your code

ImageView imageView = findViewById(R.id.imageView1);

// Display the actual image at middle left position inside the ImageView
setImageViewGravity(imageView, ImageViewGravity.MIDDLE_LEFT);

// Display the actual image at middle right position inside the ImageView
setImageViewGravity(imageView, ImageViewGravity.MIDDLE_RIGHT);

Upvotes: 1

Mahmoud Sallam
Mahmoud Sallam

Reputation: 19

You can play with android:layout_gravity="start"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="start" 
        android:layout_margin="10dp">
        <ImageView
            android:id="@+id/imageView1"
            android:src="@drawable/ic_launcher_background"
            android:layout_width="190dp"
            android:layout_height="190dp"
            android:layout_gravity="start"
             />
    </LinearLayout>
</LinearLayout> 

Upvotes: 0

Related Questions