gpt4 book ai didi

android - 将 Picasso 与 Image Getter 结合使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:58 26 4
gpt4 key购买 nike

我正在构建一个聊天应用程序,我正在尝试将图像附加到 EditText,方法是使用 Picasso 从 URL 获取图像,然后使用 append 和 ImageGetter 将图像附加到 EditText。但是,我在下面实现的内容不起作用,因为在使用该应用程序时附加消息不显示任何内容(但该消息确实显示在数据库中)。

我已经在不使用 Picasso 的情况下进行了测试,因为只需将 ImageGetter 与应用程序中的图像资源一起使用就可以正常工作,只是它不是来自所需的 URL。

配置 ImageGetter 和/或附加方法的正确方法是什么,以便此功能适用于 Picasso?或者有更简单的方法吗?

追加方法:

public void appendToMessageHistory(final String username,
final String message) {
if (username != null && message != null) {

Picasso.with(getBaseContext())
.load("http://localhost:3000/uploads/campaign/image/2/2.jpg")
.into(new Target() {

@Override
public void onPrepareLoad(Drawable arg0) {

}

@Override
public void onBitmapLoaded(Bitmap bitmap,
LoadedFrom arg1) {
Drawable drawImage = new BitmapDrawable(
getBaseContext().getResources(), bitmap);

drawImage.setBounds(0, 0,
drawImage.getIntrinsicHeight(),
drawImage.getIntrinsicWidth());
messageHistoryText.append(Html.fromHtml("<b>"
+ username + ":" + "</b>" + "<br>"));
messageHistoryText.append(Html.fromHtml(message
+ "<hr>" + "<br>")
+ System.getProperty("line.separator") + "");

messageHistoryText.append(Html
.fromHtml("<img src = '" + drawImage
+ "'/>",
imageGetter,
null));
}

@Override
public void onBitmapFailed(Drawable arg0) {

}
});

}
}

图像 getter :

ImageGetter imageGetter = new ImageGetter() {
Drawable imageUsed=null;

@Override
public Drawable getDrawable(String source) {

Picasso.with(getBaseContext())
.load("http://localhost:3000/uploads/campaign/image/2/2.jpg")
.into(new Target() {

@Override
public void onPrepareLoad(Drawable arg0) {

}

@Override
public void onBitmapLoaded(Bitmap bitmap,
LoadedFrom arg1) {
Drawable drawImage = new BitmapDrawable(
getBaseContext().getResources(), bitmap);

drawImage.setBounds(0, 0,
drawImage.getIntrinsicHeight(),
drawImage.getIntrinsicWidth());

imageUsed=drawImage;

}

@Override
public void onBitmapFailed(Drawable arg0) {

}
});

return imageUsed;
}

};

最佳答案

我无法使用 Picasso 的 Target 来让它工作......

我的解决方法是:

  • 使用 AsyncTask 实现并发
  • 使用 Picasso 的 get() 方法在 AsyncTask 的后台方法中同步加载图像

像这样:

public class PicassoImageGetter implements Html.ImageGetter {

final Resources resources;

final Picasso pablo;

final TextView textView;

public PicassoImageGetter(final TextView textView, final Resources resources, final Picasso pablo) {
this.textView = textView;
this.resources = resources;
this.pablo = pablo;
}

@Override public Drawable getDrawable(final String source) {
final BitmapDrawablePlaceHolder result = new BitmapDrawablePlaceHolder();

new AsyncTask<Void, Void, Bitmap>() {

@Override
protected Bitmap doInBackground(final Void... meh) {
try {
return pablo.load(source).get();
} catch (Exception e) {
return null;
}
}

@Override
protected void onPostExecute(final Bitmap bitmap) {
try {
final BitmapDrawable drawable = new BitmapDrawable(resources, bitmap);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

result.setDrawable(drawable);
result.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

textView.setText(textView.getText()); // invalidate() doesn't work correctly...
} catch (Exception e) {
/* nom nom nom*/
}
}

}.execute((Void) null);

return result;
}

static class BitmapDrawablePlaceHolder extends BitmapDrawable {

protected Drawable drawable;

@Override
public void draw(final Canvas canvas) {
if (drawable != null) {
drawable.draw(canvas);
}
}

public void setDrawable(Drawable drawable) {
this.drawable = drawable;
}

}

希望这是有用的。

关于android - 将 Picasso 与 Image Getter 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25194549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com