Próbuję programowo zmienić szerokość ImageView bez zmiany rozmiaru obrazu. ImageView pierwotnie pokazuje cały obraz, ale gdy szerokość obrazu zostanie zmniejszona, część obrazu powinna zostać odcięta, w ten sposób:

enter image description here

Jednak gdy mój kod zmniejsza szerokość ImageView z 350dp do 200dp, zamiast tego automatycznie zmieniany jest rozmiar obrazu:

enter image description here

Jak mogę się upewnić, że ImageView nie zmienia rozmiaru obrazu, gdy zmniejszam jego szerokość? Poniżej mój kod:

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/photo_1_preview"
        android:layout_width="350dp"
        android:layout_height="350dp"
        android:adjustViewBounds="false"
        android:background="@drawable/android"/>
</LinearLayout>

mainactivity.java :

package com.example.changingimageviewwidth;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Reduce the width of the image preview box
        ImageView imagePreviewBox = findViewById(R.id.photo_1_preview);
        imagePreviewBox.getLayoutParams().width = 250;
    }
}
2
Adam Lee 9 czerwiec 2021, 07:40

4 odpowiedzi

  <ImageView
    android:id="@+id/photo_1_preview"
    android:layout_width="350dp"
    android:layout_height="350dp"
    android:adjustViewBounds="false"
    android:scaleType="fitCenter"  //  or centerInside
    android:background="@drawable/android"/>

wystarczy użyć android:scaleType="fitCenter" // or centerInside a jeśli chcesz użyć pełnego obrazuObszar widoku android:scaleType="centerCrop"

-1
Sandeep Pareek 9 czerwiec 2021, 05:48

Spróbuj z następującym kodem.

  //activity_main.xml
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
android:gravity="center"
android:orientation="vertical">

<ImageView
    android:id="@+id/image_view"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitCenter"
    android:src="@drawable/dumy" />

</LinearLayout>


//MainActivity.java
 public class MainActivity extends AppCompatActivity {
 private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.image_view);
    imageView.getLayoutParams().width = dpToPixels(150);
    imageView.requestLayout();
    imageView.invalidate();
}

private int dpToPixels(int size) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, getResources().getDisplayMetrics());
}
}

Output

0
Dharmender Manral 18 czerwiec 2021, 16:59

Ustaw typ skali na CENTER_CROP. Spowoduje to wyśrodkowanie obrazu w widoku i wycięcie wszystkiego, co nie pasuje.

0
Gabe Sechan 9 czerwiec 2021, 05:43

Aby uzyskać pożądane zachowanie, po prostu ustaw android:scaleType="fitStart" na ImageView w xml. Nie zmieni proporcji src, ale dopasuje go do początku ImageView, tak jak wspomniałeś.

0
Ananta Raha 9 czerwiec 2021, 14:29