中心裁剪比例类型在 android 图像视图中不起作用

Center crop scale type not working in android image view

我正在尝试将 img 制作成 centerCrop,但无论我做什么都行不通!! 我同时使用了 Picasso 和 Glide,结果是一样的, 我搜索了 google、github 和 Whosebug,我发现很多像我这样的案例,但没有适合我的解决方案..任何帮助请求! 这是我的 xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="6dp"
    app:cardCornerRadius="15dp"
    app:cardElevation="0dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.cardview.widget.CardView
            android:id="@+id/item_audio_iv_cv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_margin="10dp"
            app:cardCornerRadius="15dp"
            app:cardElevation="7dp">

            <ImageView
                android:id="@+id/item_audio_iv"
                android:layout_width="55dp"
                android:layout_height="55dp"
                android:scaleType="centerCrop"
                android:src="@mipmap/ic_launcher" />

        </androidx.cardview.widget.CardView>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_toEndOf="@id/item_audio_iv_cv"
            android:layout_toRightOf="@id/item_audio_iv_cv"
            android:orientation="vertical"
            android:paddingRight="12dp"
            android:paddingLeft="12dp"
            android:paddingTop="5dp">

            <TextView
                android:id="@+id/item_audio_title_tv"
                style="@style/TextAppearance.AppCompat.Body1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/item_audio_artist_tv"
                style="@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                android:paddingTop="3dp"
                android:textSize="13sp" />

        </LinearLayout>

    </RelativeLayout>

</androidx.cardview.widget.CardView>

这是我的适配器代码,我同时使用了 Glide 和 Picasso,但它们不起作用:

package com.abc.ump.adapters;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.request.RequestOptions;
import com.abc.ump.R;
import com.abc.ump.classes.Audio;
import com.abc.ump.utils.AppUtils;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class AudiosAdapter extends RecyclerView.Adapter<AudiosAdapter.ViewHolder> {
    private Context mContext;
    private ArrayList<Audio> mAudios;
    private long[] mAudioIds;

    public AudiosAdapter(Context context, ArrayList<Audio> audios) {
        this.mContext = context;
        this.mAudios = audios;
        this.mAudioIds = getAudioIds();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_audio, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.audioTitle.setText(mAudios.get(position).getTitle());
        holder.audioArtist.setText(mAudios.get(position).getArtist());

        Picasso.get()
                .load(AppUtils.getAlbumArtUri(mAudios.get(position).getAlbumId()))
                .placeholder(R.mipmap.ic_launcher)
                .centerCrop().fit()
                .into(holder.audioArt);

//        Glide.with(mContext)
//                .applyDefaultRequestOptions(new RequestOptions()
//                        //TODO:set default image
//                        .placeholder(R.mipmap.ic_launcher)
//                        .error(R.mipmap.ic_launcher))
//                .asBitmap()
//                .load(AppUtils.getAlbumArtUri(mAudios.get(position).getAlbumId()))
//                .centerCrop()
//                .into(holder.audioArt);
    }

    @Override
    public int getItemCount() {
        return mAudios.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView audioArt;
        private TextView audioTitle, audioArtist;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            audioArt = itemView.findViewById(R.id.item_audio_iv);
            audioTitle = itemView.findViewById(R.id.item_audio_title_tv);
            audioArtist = itemView.findViewById(R.id.item_audio_artist_tv);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
//            // TODO : change destination fragment type and send some info
//            FragmentManager fragmentManager = ((AppCompatActivity) mContext).getSupportFragmentManager();
//            AudiosFragment audiosFragment = new AudiosFragment();
//            fragmentManager.beginTransaction().hide(fragmentManager.findFragmentById(R.id.base_container))
//                    .add(R.id.base_container, audiosFragment).addToBackStack(null).commit();
        }
    }

    public void updateDataSet(ArrayList<Audio> newAudios) {
        mAudios = newAudios;
        mAudioIds = getAudioIds();
    }
    public long[] getAudioIds() {
        long[] temp = new long[mAudios.size()];
        for (int i = 0; i < getItemCount(); i++) {
            temp[i] = mAudios.get(i).getId();
        }

        return temp;
    }
}

这就是我每次得到的结果:

pic1

但这就是我想要做的:

pic2

对不起,我的语言不好,我希望你能理解我的问题并能帮助我..

谢谢!

注意使用没有白色的图片space

注意:@mipmap/ic_launcherruntime[中有白色space =23=]

尝试使用 Picasso 或 Glide

加载此 url

url -> https://i.picsum.photos/id/1074/536/354.jpg?hmac=zonZY4ypdNxP4jnidSxsqNsr8Vi0jnHezdA_kZkghSc

这只是因为我使用的 api 小于 21,所以 clipToOutline 不适用于旧版本,因此图像视图无法从 cardView

获取角收音机

谢谢大家 3>