我是用viewpager做的滑动查看大图的功能
static class SamplePagerAdapter extends PagerAdapter {
WeakReference<PreviewImgFragment> mActivity;
PreviewImgFragment theActivity;
AlertDialog.Builder saveBuilder;
AlertDialog.Builder warningBuilder;
Bitmap bitmap;
public SamplePagerAdapter(PreviewImgFragment activity) {
mActivity = new WeakReference<>(activity);
theActivity = mActivity.get();
saveBuilder = new AlertDialog.Builder(theActivity.activity);
saveBuilder.setMessage("保存图片");
saveBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
AppUtils.saveImageToGallery(bitmap);
ToastUtil.showToast("保存成功");
}
});
warningBuilder = new AlertDialog.Builder(theActivity.activity);
warningBuilder.setMessage("图片还没有准备好!");
warningBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
saveBuilder.setOnDismissListener(onDismissListener);
warningBuilder.setOnDismissListener(onDismissListener);
}
private DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (null != cacheView) {
cacheView.setEnabled(true);
}
}
};
@Override
protected void finalize() throws Throwable {
super.finalize();
onLongClickListener = null;
}
private View cacheView = null;
View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
cacheView = v;
v.setEnabled(false);
Uri uri = (Uri) v.getTag();
bitmap = AppUtils.returnBitmap(uri);
if (null != bitmap) {
Log.i("bitmap", bitmap.getHeight() + "*********" + bitmap.getWidth() + "");
saveBuilder.show();
} else {
warningBuilder.show();
}
return true;
}
};
@Override
public int getCount() {
return theActivity.list == null ? 1 : theActivity.list.size();
}
@Override
public View instantiateItem(ViewGroup container, int position) {
Log.e("instantiateItem","instantiateItem");
View convertView = View.inflate(SmartApplication.application, R.layout.loading_layout, null);
PhotoDraweeView photo = (PhotoDraweeView) convertView.findViewById(R.id.each_photo);
Uri uri = null;
if (theActivity.list != null) {
String url = AppUtils.getImg(theActivity.list.get(position) instanceof ImageInfo ? ((ImageInfo) theActivity.list.get(position)).getBigImageUrl() : (String) theActivity.list.get(position));
if (url.startsWith("http")) {
uri = Uri.parse(url);
} else {
uri = (new Uri.Builder())
.scheme("file")
.path(url)
.build();
}
} else {
if (theActivity.img.startsWith("http")) {
uri = Uri.parse(theActivity.img);
} else {
uri = (new Uri.Builder())
.scheme("file")
.path(AppUtils.getImg(theActivity.img))
.build();
}
}
GenericDraweeHierarchy hierarchy = photo.getHierarchy();
if (null == photo.getTag()) {
hierarchy.setProgressBarImage(new CustomProgressBar(photo));
} else {
// Log.e("previewLLL", photo.getTag().toString());
hierarchy = null;
}
photo.setPhotoUri(uri);
photo.setOnLongClickListener(onLongClickListener);
photo.setOnPhotoTapListener(new OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
theActivity.back.callOnClick();
}
});
container.addView(convertView);
return convertView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.e("destroyItem","destroyItem");
View contentView = (View) object;
container.removeView(contentView);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
现在发现滑动的时候卡顿这是什么原因的大大们 ,求帮忙。谢谢!
Les grandes images doivent être compressées. Par exemple, si l'image est de 2000X2000 ou plus, mais que l'écran entier du téléphone mobile n'est pas si grand, le bitmap sera très grand et il ne sera que partiellement chargé lorsque cela sera nécessaire. être agrandi. De plus, viewpager doit également prendre en compte la mise en cache, c'est-à-dire le nombre de pages chargées dans le cache. Il existe de nombreux types de PagerAdapters pour viewpager, et ils peuvent être définis si cela n'est pas approprié, si vous définissez 100 pages. peuvent tous être chargés en même temps, et il peut être très bloqué.
Selon votre code, les images Web sont chargées lors du glissement. Je ne sais pas comment vous le gérez ici. Il est recommandé d'utiliser Picasso ou glide pour le gérer.
Je ne vois aucun décalage. Il est recommandé d'ajouter BlockCanary pour le vérifier et le résoudre de manière ciblée