我是用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;
}
}
现在发现滑动的时候卡顿这是什么原因的大大们 ,求帮忙。谢谢!
大きな画像は圧縮する必要があります。たとえば、画像が 2000X2000 以上であっても、携帯電話の画面全体がそれほど大きくない場合、ビットマップは非常に大きくなり、必要なときに部分的にのみロードされます。拡大される。さらに、viewpager はキャッシュ、つまり何ページをキャッシュにロードするかを考慮する必要があります。Viewpager には多くの PagerAdapter があり、それが適切に行われていないと、100 ページを設定するとすべてロードされてしまう可能性があります。一度だけで、非常に行き詰まっている可能性があります。
あなたのコードによると、スライド時にWeb画像が読み込まれますが、ここでどのように処理するかはわかりません。Picassoまたはglideを使用して処理することをお勧めします。
どこに遅れがあるのかわかりません。BlockCanary を追加して、対象を絞った方法で確認して解決することをお勧めします。