android - viewpager 查看大图卡顿
ringa_lee
ringa_lee 2017-04-18 09:14:30
0
2
509

我是用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;
        }
    }
    
    
    

现在发现滑动的时候卡顿这是什么原因的大大们 ,求帮忙。谢谢!

ringa_lee
ringa_lee

ringa_lee

répondre à tous(2)
小葫芦

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal