使用 Picasso 将 9 patch 设置为 imageView src
set 9 patch as imageView src with Picasso
我有一个 ImageView,我从网络加载图像(中心裁剪)
<ImageView
android:id="@+id/content_image_view"
android:layout_width="match_parent"
android:layout_height="160dp"
android:scaleType="centerCrop"
android:src="@drawable/course" />
一个对象通过一个 int(本地可绘制对象的 ID)到达我的适配器,有时是一个 url。
如果 url 为 null 我加载本地可绘制对象,它可以是 9 补丁。
然后我的 9patches 被放大显示。
我尝试了不同的方法,但现在:
ApiController.getInstance().tokenedPicasso.with(holder.contentImageView.getContext())
.load(formatted.contentImageUrl)
.placeholder(formatted.contentPlaceHolderId)
.centerCrop()
.fit()
.config(Bitmap.Config.RGB_565)
.into(holder.contentImageView);
以前有人试过做同样的事情吗?
谢谢,
我已经部分回答了我的问题,
我先测试是否会显示 9 补丁,如果是,我更改比例类型 FIT_XY。
但我会继续寻找更优雅的解决方案。因为判断是否会显示 9 补丁有时会很复杂,我宁愿有一些至少可以与我的所有可绘制对象一起使用的东西。
好吧,我用另一种方式解决了它,它是这样工作的。
- 如果未加载数据 -> 显示占位符。9.png
- IF 数据已加载
-> 显示图片
Before all thing we should create extended ImageView with Target.
通话中:
Picasso.with(getContext()).load(url).into((Target)imageViewTarget);
自定义 ImageView:
public class ImageViewTarget extends ImageView implements Target {
public ImageViewTarget(Context context) {
super(context);
}
public ImageViewTarget(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ImageViewTarget(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void setPlaceHolder() {
Drawable d = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
d = getResources().getDrawable(R.drawable.blank_photo);
} else {
d = getResources().getDrawable(R.drawable.blank_photo, getContext().getTheme());
}
if(d!=null) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
setBackgroundDrawable(d);
} else {
setBackground(d);
}
}
setPadding(0, 0, 0, 0);
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
setImageDrawable(new BitmapDrawable(getResources(), bitmap));
setScaleType(ScaleType.CENTER_CROP);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
//...
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
setPlaceHolder();
}
}
我有一个 ImageView,我从网络加载图像(中心裁剪)
<ImageView
android:id="@+id/content_image_view"
android:layout_width="match_parent"
android:layout_height="160dp"
android:scaleType="centerCrop"
android:src="@drawable/course" />
一个对象通过一个 int(本地可绘制对象的 ID)到达我的适配器,有时是一个 url。
如果 url 为 null 我加载本地可绘制对象,它可以是 9 补丁。 然后我的 9patches 被放大显示。
我尝试了不同的方法,但现在:
ApiController.getInstance().tokenedPicasso.with(holder.contentImageView.getContext())
.load(formatted.contentImageUrl)
.placeholder(formatted.contentPlaceHolderId)
.centerCrop()
.fit()
.config(Bitmap.Config.RGB_565)
.into(holder.contentImageView);
以前有人试过做同样的事情吗? 谢谢,
我已经部分回答了我的问题,
我先测试是否会显示 9 补丁,如果是,我更改比例类型 FIT_XY。
但我会继续寻找更优雅的解决方案。因为判断是否会显示 9 补丁有时会很复杂,我宁愿有一些至少可以与我的所有可绘制对象一起使用的东西。
好吧,我用另一种方式解决了它,它是这样工作的。
- 如果未加载数据 -> 显示占位符。9.png
- IF 数据已加载 -> 显示图片
Before all thing we should create extended ImageView with Target.
通话中:
Picasso.with(getContext()).load(url).into((Target)imageViewTarget);
自定义 ImageView:
public class ImageViewTarget extends ImageView implements Target {
public ImageViewTarget(Context context) {
super(context);
}
public ImageViewTarget(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ImageViewTarget(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void setPlaceHolder() {
Drawable d = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
d = getResources().getDrawable(R.drawable.blank_photo);
} else {
d = getResources().getDrawable(R.drawable.blank_photo, getContext().getTheme());
}
if(d!=null) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
setBackgroundDrawable(d);
} else {
setBackground(d);
}
}
setPadding(0, 0, 0, 0);
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
setImageDrawable(new BitmapDrawable(getResources(), bitmap));
setScaleType(ScaleType.CENTER_CROP);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
//...
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
setPlaceHolder();
}
}