【问题标题】:Center crop scale type not working in android image view中心裁剪比例类型在 android 图像视图中不起作用
【发布时间】:2021-08-17 03:25:06
【问题描述】:

我正在尝试将 img 制作为 centerCrop,但我所做的一切都不起作用! 我用毕加索和滑翔,结果是一样的, 我搜索了 google、github 和 stackoverflow,我发现了很多像我这样的案例,但没有任何解决方案适合我..任何帮助请求! 这是我的 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

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

谢谢!

【问题讨论】:

  • 如何将 XML 布局中图像视图的比例类型更改为适合中心
  • 我已经尝试过了.. 效果不佳,但我发现 picasso 和 glide 都在我使用它们加载图片时删除了此属性,因此我什至可以从中删除 src 和 scaleType xml,它不会影响任何事情
  • fitXY 怎么样?我在我的应用程序中将它与 centerCrop() 一起使用

标签: android imageview picasso android-glide


【解决方案1】:

注意使用没有空白的图片

注意:@mipmap/ic_launcherruntime

中有空白

尝试使用 Picasso 或 Glide 加载此网址

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

【讨论】:

  • 但即使是专辑封面也显示相同的结果,尽管它们没有空格!!
  • 我会尽快尝试你所说的,非常感谢 3>
【解决方案2】:

只是因为我使用的 api 小于 21,所以 clipToOutline 不适用于旧版本,因此图像视图无法从 cardView 中获取角落无线电

感谢每一位 3>

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2017-06-23
    • 2020-10-08
    • 1970-01-01
    • 2011-05-04
    • 2015-02-02
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多