Reputation: 297
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
Reputation: 14173
Background
Here is an ImageView
and each position that you want to put the actual image inside it.
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
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