Прикрепление, чтобы заменить вектор, который можно вырезать с помощью изображения с камеры, и растягиваемый растягивается за изображение?

У меня есть некоторая настройка кода, когда пользователь делает снимок с помощью своей камеры и загружается на страницу в существующем представлении изображения – когда страница загружается по умолчанию, есть изображение-заполнитель, но как только они снимают фотографию с помощью своей камеры, она заполняет imageview (вид), но вектор изображения все еще появляется за ним и, кажется, растягивает весь контейнер?

Для справки, вот два изображения, до и после:

До
Пустой экран профиля

После растянутое изображение выше данных профиля

Все, что я хочу, – это то, что изображение заменяет drawable, которое у меня есть в качестве заполнителя, и заполняйте ширину контейнера, удерживая его, но я предполагаю, что что-то в моем коде должно быть где-то неправильно.

Ниже представлен файл макета для этой страницы:

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/edit_profile_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.android.projectrc.activities.ViewProfileActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:fitsSystemWindows="true"> <include android:id="@+id/edit_profile_app_bar" layout="@layout/edit_profile_support_bar" /> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/profile_image_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/lighter_gray" android:gravity="center_vertical|center_horizontal" android:minHeight="275dp"> <ImageView android:id="@+id/profile_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/account_image_background" android:padding="1dp" app:srcCompat="@drawable/ic_account_circle_white_48px" /> </LinearLayout> <TextView android:id="@+id/profile_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Name" android:textAlignment="center" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:textStyle="bold" /> <TextView android:id="@+id/name_change_link" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="2dp" android:text="Change Name" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginBottom="3dp" android:text="Private Details" /> <android.support.v7.widget.RecyclerView android:id="@+id/private_items_recycler" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Optional Details" /> <android.support.v7.widget.RecyclerView android:id="@+id/optional_items_recycler" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout> 

И это код, который загружает фотографию камеры:

 private fun loadBitmapImage() { //get view dimensions val maxWidth = profile_image_container.width val maxHeight = profile_image_container.height //get image dimensions val options = BitmapFactory.Options() options.inJustDecodeBounds = true BitmapFactory.decodeFile(mProfilePhotoPath, options) Log.i(TAG, "image height :: ${options.outHeight}\nimage width :: ${options.outWidth}\n" + "image bitmap :: ${options.inBitmap}") //calculate image scaling (if necessary) options.inSampleSize = Utilities.calculateInSampleSize(options, maxWidth, maxHeight) //now we can load the image options.inJustDecodeBounds = false val smallBitmap = BitmapFactory.decodeFile(mProfilePhotoPath, options) val imageView = profile_image as AppCompatImageView imageView.setImageBitmap(smallBitmap) } 

И (если необходимо) это метод calculateInSampleSize:

 fun calculateInSampleSize( options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int { // Raw height and width of image val height = options.outHeight val width = options.outWidth var inSampleSize = 1 if (height > reqHeight || width > reqWidth) { val halfHeight = height / 2 val halfWidth = width / 2 // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) { inSampleSize *= 2 } } 

Я предполагаю, что это связано с общей логикой ваших взглядов и тем, как вы заменяете изображение.

Когда ваше приложение находится в состоянии «по умолчанию», контейнер будет (w:match_parent, h:275dp) .

Это то, что вы используете, чтобы рассчитать понижающую дискретизацию вашего изображения.

Теперь, поскольку вы вряд ли собираетесь делать снимки с таким соотношением (отношение вашего линейного макета imageView.setImageBitmap(smallBitmap) , imageView.setImageBitmap(smallBitmap) который вы собираетесь загрузить, не подходит идеально.

Итак, вот несколько советов, которые вы могли бы подумать:

  1. Добавьте в свой ImageView тип scaleType. Вот ссылка на представление каждого из них: https://robots.thoughtbot.com/android-imageview-scaletype-a-visual-guide
  2. Не забудьте добавить app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"

    к вашему NestedScrollView (поэтому верх не скрывается под AppBar, и ваш ImageView фактически выглядит вертикально)

  3. Попытайтесь переосмыслить, как вы хотите отображать изображение, взятое из камеры (соотношение или внутри функции calculateInSampleSize , как вы пожелаете).

Intereting Posts
Как передать String в Int и Long? Возвращение рекурсивной функции из другой функции Котлина Kotlin Аннотация IntDef Kotlin / Android – KotlinReflectionInternalError в классе данных с лямбдой Почему у kotlin есть функции componentN в классе данных, если у них уже есть геттеры и сеттеры? Реализация пространства настойчивости в Котлине Kotlin: ProGuard стирает атрибуты свойств как вы получаете Idlingresource для работы в Kotlin с сопрограммами Работа Gradle работает на локальной машине, но не работает на сервере Jenkins CI? Firebase-соединение не работает на Linux в SpringBoot Как скомпилировать модуль домена Kotlin с клиентским модулем с Gradle? В Kotlin почему аргумент по умолчанию не передается после того, как функция назначается переменной? Как использовать делегат injectLazy () из библиотеки Injekt с дженериками? Apache Tomcat 8.0 не может загрузить класс сервлета, написанный в Kotlin, используя Eclipse для Java EE, Mars 2 Почему структура значений отличается при отладке?