中心裁剪比例类型在 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_launcher在runtime[中有白色space =23=]
尝试使用 Picasso 或 Glide
加载此 url
url -> https://i.picsum.photos/id/1074/536/354.jpg?hmac=zonZY4ypdNxP4jnidSxsqNsr8Vi0jnHezdA_kZkghSc
这只是因为我使用的 api 小于 21,所以 clipToOutline 不适用于旧版本,因此图像视图无法从 cardView
获取角收音机
谢谢大家 3>
我正在尝试将 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_launcher在runtime[中有白色space =23=]
尝试使用 Picasso 或 Glide
加载此 urlurl -> https://i.picsum.photos/id/1074/536/354.jpg?hmac=zonZY4ypdNxP4jnidSxsqNsr8Vi0jnHezdA_kZkghSc
这只是因为我使用的 api 小于 21,所以 clipToOutline 不适用于旧版本,因此图像视图无法从 cardView
获取角收音机谢谢大家 3>