继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

关于PhotoView在统一页面加载全屏图片出现图片位置偏移的问题解决

红颜莎娜
关注TA
已关注
手记 125
粉丝 17
获赞 65

现在很多应用都会使用到的功能,photoview在加载本地图片时不会出现图片位置偏移到一侧,而加载网络图片时因为有一个加载的过程导致出现问题。下面代码时viewpager中加载图片的代码:spacer.gifspacer.gif 

gv.setAdapter(new BaseAdapter() {

            @Override
            public int getCount() {return imgs.length;}
            @Override
            public Object getItem(int position) {return null;}
            @Override
            public long getItemId(int position) {return 0;}
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                final PhotoView p = new PhotoView(PhotoBrowse2.this);
                p.setLayoutParams(new AbsListView.LayoutParams((int) (getResources().getDisplayMetrics().density * 100), (int) (getResources().getDisplayMetrics().density * 100)));
                p.setScaleType(ImageView.ScaleType.CENTER_CROP);
                String uri="http://120.77.244.86:8000/images/"+imgs[position];
                //1.加载大家都知道的(注释掉)
		//Glide.with(PhotoBrowse2.this).load(uri).into(p);
                //2.
                Glide.with(PhotoBrowse2.this).load(uri).asBitmap().into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        p.setImageBitmap(resource);
                    }
                });
                // 把PhotoView当普通的控件把触摸功能关掉
                p.disenable();
                return p;
            }
        });
我们会在当前一个页面写一个隐藏的布局包含PhototView,当我们点击Viewpager时就会显示出来,点击PhotoView就会隐藏。根据出现
的问题,我第一个想到的是因为动画显示出隐藏PhototView的同时正在加载网络图片资源。那我们就应该在加载完图片后在去动画显示
PhotoView。
第一种方法是没有做处理的。
第二种方法是在into方法中使用GlideDrawableImageViewTarget方法在回调中开启隐藏
PhototView,但是因为在GridView中点击才触发的导致此方法无法正常执行。
第三种方法是添加listener()监听,在onResourceReady的回调中动态显示PhototView,效果不但没有解决反而更加严重每次都会便宜了,
第四种下面没有我就直接说了,在gv中以加载bitmap的方式设置bitmap,我们可以保存bitmap。在gv点击事件中直接设置bitmap对象就可以解决问题了。
第五种方法是先获取bitmap然后设置到photview动画显示即可解决,
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
        final PhotoView p = (PhotoView) view;
        mInfo = p.getInfo();
        String uri="http://120.77.244.86:8000/images/"+imgs[position];
        //1.第一种方法是
        Glide.with(PhotoBrowse2.this).load(uri).into(mPhotoView);
        mBg.startAnimation(in);
        mBg.setVisibility(View.VISIBLE);
        mParent.setVisibility(View.VISIBLE);
        mPhotoView.animaFrom(mInfo);
        //2.
        Glide.with(PhotoBrowse2.this).load(uri).into(new GlideDrawableImageViewTarget(mPhotoView){
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {
                super.onResourceReady(resource, animation);
                mBg.startAnimation(in);
                mBg.setVisibility(View.VISIBLE);
                mParent.setVisibility(View.VISIBLE);
                mPhotoView.animaFrom(mInfo);
            }
        });
        //3.
        Glide.with(PhotoBrowse2.this).load(uri).listener(new RequestListener<String, GlideDrawable>() {
            @Override
            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                return false;
            }
            @Override
            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                mBg.startAnimation(in);
                mBg.setVisibility(View.VISIBLE);
                mParent.setVisibility(View.VISIBLE);
                mPhotoView.animaFrom(mInfo);
                return false;
            }
        }).into(mPhotoView);
        //5.
        Glide.with(PhotoBrowse2.this).load(uri).asBitmap().into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                mPhotoView.setImageBitmap(resource);
                mBg.startAnimation(in);
                mBg.setVisibility(View.VISIBLE);
                mParent.setVisibility(View.VISIBLE);
                mPhotoView.animaFrom(mInfo);
            }
        });
    }
});[object Object][object Object][object Object][object Object][object Object]
总结:4,5两种方法可以解决,2,3两种无法解决。我使用的PhotoView控件是来自sdsadsadasdasd。地址是http://www.apkbus.com/thread-271645-1-1.html			他的PhtotView控件代码量非常少推荐使用。

5ba39fdc0001784703300601.jpg

原文链接:http://www.apkbus.com/blog-874691-63186.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP