изменение размера изображения с помощью Piccasso делает мое приложение не приспособленным к устройствам других размеров - PullRequest
0 голосов
/ 06 июня 2019

У меня есть файл макета, который представляет элемент строки в recyclerView.Этот элемент строки содержит изображение, которое загружается через библиотеку Piccaso при переходе к методу onBindViewHolder и изменяет ширину и высоту изображения до определенного значения. Проблема в том, что когда я записываю значение как, скажем, -

.resize(250, 250)

это означает, что независимо от размера устройства оно всегда будет составлять 250 пикселей - для пикселя 1 это было бы здорово, но для пикселя 3 XL это было бы крошечно.

как я могсделать функцию изменения размера Piccaso динамической, чтобы я мог настроить ее в соответствии с текущим размером экрана?

вот мой элемент строки XML -


<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="#b0b3b7"
    android:elevation="@dimen/hero_row_elevation"
    android:tag="0"
    app:cardCornerRadius="@dimen/hero_row_corner_radius">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#b0b3b7"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/heroImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@mipmap/ic_launcher"
            app:layout_constraintEnd_toStartOf="@id/heroTitle"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

        <ProgressBar
            android:id="@+id/adapterProgressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@mipmap/ic_launcher"
            app:layout_constraintEnd_toStartOf="@id/heroTitle"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

        <TextView
            android:id="@+id/heroTitle"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="32dp"
            android:layout_marginTop="5dp"
            android:autoSizeMaxTextSize="25dp"
            android:autoSizeMinTextSize="15dp"
            android:text="@string/hero_row_hero_title"
            android:textColor="#000"
            android:textSize="@dimen/hero_row_title_text_size"
            android:textStyle="bold"
            app:layout_constraintBottom_toTopOf="@+id/heroAbilities"
            app:layout_constraintEnd_toStartOf="@+id/heartImageView"
            app:layout_constraintStart_toEndOf="@+id/heroImage"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/heroAbilities"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="32dp"
            android:autoSizeMaxTextSize="25dp"
            android:autoSizeMinTextSize="15dp"
            android:breakStrategy="simple"
            android:hyphenationFrequency="none"
            android:text="@string/hero_row_abilities_text"
            android:textColor="#444"
            android:textSize="@dimen/hero_row_abilities_text"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/heroImage"
            app:layout_constraintTop_toBottomOf="@+id/heroTitle" />

        <ImageView
            android:id="@+id/heartImageView"
            android:layout_width="@dimen/hero_row_heart_size"
            android:layout_height="@dimen/hero_row_heart_size"
            android:layout_marginTop="9dp"
            android:layout_marginEnd="24dp"
            android:src="@drawable/empty_heart"
            android:tag="1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/heroTitle"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>

, а вот мой onBindViewHolder ();метод -


@Override
    public void onBindViewHolder(@NonNull final HeroesViewHolder holder, int position) {

        final Hero currentHero = heroList.get(position);
        String str = String.join(",", currentHero.abilities);

        holder.heroTitle.setText(currentHero.title);
        holder.heroAbilities.setText(str);
        Picasso.get()
                .load(currentHero.image)
                .resize(250, 250)
                .error(R.drawable.ic_launcher_foreground)
                .into(holder.heroesImage, new Callback() {
                    @Override
                    public void onSuccess() {
                        holder.progressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError(Exception e) {

                    }
                });
        if (!currentHero.isFavorite()){
            Picasso.get()
                    .load(R.drawable.empty_heart)
                    .into(holder.heartImageview);
        } else {
            Picasso.get()
                    .load(R.drawable.full_heart)
                    .into(holder.heartImageview);
        }

        setFadeAnimation(holder.itemView);
    }

1 Ответ

2 голосов
/ 06 июня 2019

Всякий раз, когда вы используете функцию resize() в Picasso, они четко указали следующую строку в своей документации здесь :

изменяет размеры изображения до этих размеров (в пикселях). не уважает соотношение сторон

Существует причина, по которой в Android существует термин "dp" или Density Independent Pixels. Если вы хотите, чтобы изображение было однородным на всех устройствах, установите соответствующие layout_width и layout_height в файле макета в "dp", и оно будет одинаковым на всех устройствах независимо от их размера / плотности экрана.

...