我正在使用Picasso框架来处理我的Android应用中的图像加载.加载图像后,我需要访问Drawable以应用一些屏蔽操作.问题是Picasso将Drawable转换为PicassoDrawable,而简单的转换为Drawable不起作用.
这是我的代码:
Picasso.with(mContext).load(image.getPath()).into(mImageView, new Callback() {
@Override
public void onSuccess() {
Util.applyMask(imageView);
}
@Override
public void onError() {
}
});
Run Code Online (Sandbox Code Playgroud)
和Util.applyMask(ImageView)方法:
public static void applyMask(ImageView imageView) {
// this is where a class cast exception happens since it's actually a PicassoDrawable and not a Drawable
Bitmap mainImage = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
// ...
}
Run Code Online (Sandbox Code Playgroud)
Jake Wharton在这个github问题中给出了一个可能的解决方案:https://github.com/square/picasso/issues/38
总而言之,解决方案是:"如果您想直接访问Bitmap,那么您将需要使用Target回调.PicassoDrawable用于允许淡入淡出和调试指示器."
我不确定如何访问Target回调.谁知道如何解决这个问题?
谢谢.
我正在尝试使用Picasso库将外部图像加载到一行中ListView.我有一个ArrayAdapter如下习惯:
public class RevisedBusinessesAdapter extends ArrayAdapter<HashMap<String, String>> {
Context context;
int layoutResourceId;
ArrayList<HashMap<String, String>> data = null;
public RevisedBusinessesAdapter(Context context, int layoutResourceId, ArrayList<HashMap<String, String>> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
RevisedBusinessHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new RevisedBusinessHolder(); …Run Code Online (Sandbox Code Playgroud) 我正试图在我的Android应用程序中用Fresco替换Picasso.但是我不确定如何使用Fresco简单地加载位图.
毕加索我会做以下几点.
Bitmap poster = Picasso.with(getActivity())
.load(url)
.resize(Utils.convertDpToPixel(WIDTH,HEIGHT))
.centerCrop()
.get();
Run Code Online (Sandbox Code Playgroud)
我一直无法弄清楚如何用这个Fresco创建一个Bitmap.有任何想法吗?
这是关于毕加索行为的一个关键点我不知道.
想象一下,你正在展示十件物品的幻灯片.比如,他们在屏幕上各持有十秒钟.
理想的行为是这样的:在幻灯片放映开始时,我只是执行以下操作:
picasso.get( url1 )
picasso.get( url2 )
picasso.get( url3 )
picasso.get( url4 )
picasso.get( url5 )
picasso.get( url6 )
picasso.get( url7 )
picasso.get( url8 )
picasso.get( url9 )
picasso.get( url10 )
Run Code Online (Sandbox Code Playgroud)
事实上,毕加索会一次一个地排队.
毕加索的行为是什么,如果我告诉它一次预热10个网址?
是否有可能让毕加索一次只做一件事,按顺序 - 是否有这样的选择?
(产生的其他问题是,你可以取消队列,还是......?)
感谢@alicanozkara在这个页面上的惊人答案我第一次了解到
https://github.com/facebook/fresco
(13k星)无论好坏,我认为毕加索时代可能已经结束了.
我无法使用Android 9.0 Pie中的Picasso库加载图像.实际上,它适用于以下版本.它没有显示任何错误消息.有人用Github分享了他的日志
Picasso.get().setLoggingEnabled(true);
Run Code Online (Sandbox Code Playgroud)
他有消息日志:
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: initViewContentFetcherClass
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: ViewContentFetcher : ViewContentFetcher
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: createInterceptor took 0ms
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Catcher list invalid for com.xyz.test.testpicasso@com.xyz.test.testpicasso.MainActivity@147874166
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Get featureInfo from config pick_mode
2018-10-19 13:13:20.485 24840-24840/com.xyz.test.testpicasso D/Picasso: Main created [R1] Request{https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png}
2018-10-19 13:13:20.492 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher enqueued [R1]+6ms
2018-10-19 13:13:20.492 24840-24866/com.xyz.test.testpicasso D/Picasso: Hunter executing [R1]+7ms
2018-10-19 13:13:20.555 1531-1684/? I/ActivityManager: Displayed com.xyz.test.testpicasso/.MainActivity: +114ms
2018-10-19 13:13:20.555 5475-5603/? D/PowerKeeper.Event: notifyActivityLaunchTime: …Run Code Online (Sandbox Code Playgroud) 我一直在搜索SO线程的答案,但无法从之前的讨论中找出我的问题.我有一个listview加载大约50个图像(它曾经是大约100个图像,但根本没有加载任何图像).从api端点获取我的JSON内容(包括图像URL)后,通过适配器,我的代码将其放入listview中.
目前,有50张图片,当我向下滚动Feed时,毕加索将一次加载一张图片.我觉得好像保持滚动固定在列表视图中的一个项目将使该图像加载更快.然而,当我向上滚动时,它会将占位符放回并重新加载图像.有没有办法解决这个问题?
public class MainActivity extends Activity {
private List<Post> myPosts = new ArrayList<Post>();
protected String[] mBlogPostTitles;
public static final String TAG = MainActivity.class.getSimpleName();//prints name of class without package name
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(isNetworkAvailable()) {
GetBlogPostsTask getBlogPostsTask = new GetBlogPostsTask(); // new thread
getBlogPostsTask.execute();// don't call do in background directly
}else{
Toast.makeText(this, "Network is unavailable", Toast.LENGTH_LONG).show();
}
}
public boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
boolean isAvailable = false; …Run Code Online (Sandbox Code Playgroud) 更新#1
添加了hasStableIds(true)并将Picasso更新到版本2.5.2.它没有解决问题.
再生产:
RecyclerView with GridLayoutManager(spanCount = 3).列表项是带有ImageView的CardViews.
当所有项目都不适合时,在一个项目上调用notifyItemChanged的屏幕会导致对onBindViewHolder()的多次调用.一个调用是来自notifyItemChanged其他人的位置,用于屏幕上不可见的项目.
问题:
有时,传递给notifyItemChanged的位置的项目加载了属于不在屏幕上的项目的图像(很可能是由于视图持有者的回收 - 尽管我会假设如果项目保留在原位,那么传递的视图持有者会是一样的).
我发现Jake在这里关于调用load()的其他问题的评论,即使文件/ uri为null.图像加载到每个onBindViewHolder上.
简单示例应用:
git clone https://github.com/gswierczynski/recycler-view-grid-layout-with-picasso.git
Run Code Online (Sandbox Code Playgroud)
点击一个项目调用notifyItemChanged,其参数等于该项目的位置.
码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
}
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv);
rv.setLayoutManager(new …Run Code Online (Sandbox Code Playgroud) 我一直在广泛使用毕加索通过互联网检索图像到我的应用程序.现在,我遇到了一种情况,我需要将一个小图像检索到操作栏(就像标题文本旁边的徽标一样).
毕加索可以做到这一点吗?如果是这样,我该怎么做?
任何人都可以指出一个例子,说明如何使用Picasso以编程方式更改XML布局的背景?我发现的所有示例都能够使用Picasso更新ImageView,但不能更新布局背景.
在运行时onStart()方法上尝试Picasso时,它通常使用控制台的下载链接从Firebase加载图像.
但是当我尝试在StorageReference onSuccess方法中加载图像时,它就无法工作.
这个类正在扩展片段:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY_IN && resultCode == Activity.RESULT_OK) {
isGranted = true;
String path = FireStorage.retUID() + "/";
showIndProgress();
Uri uri = data.getData();
StorageReference childPathRef = FireStorage.storageRef.child(path + uri.getLastPathSegment());
childPathRef.putFile(uri)
.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()) {
Picasso.with(mContext).load(task.getResult().getDownloadUrl())
.into(profView);
Picasso.Builder build = new Picasso.Builder(mContext);
build.listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception …Run Code Online (Sandbox Code Playgroud)