Android 加载长图片的自定义控件!解决安卓加载长图出现解码失败导致显示空白的问题!

          关于解决超大图片超过bitmap能够显示的宽高的问题。

 

         我们有的时候需要加载一张非常长的图片比如 800*20000的图片,有的机型却只支持8000*8000这样的话图片的宽高任何一边查过了8000那么这个图片都不会显示出来,目前我写的自定义控件解决办法就是把bitmap抽出来切割成合适的几个等分再绘图上去,这样就解决了单个图片bitmap 超大的显示问题。

因为我只对图片做高处理没对宽做处理况且一般情况下也只有高的处理如果有需求可以在

protected void onDraw(Canvas canvas) {}

具体只重写了imageView的两个方法目前第一次写博客看不懂请大家多多包涵

 

setImageDrawable  bitmap从这里拿是因为所以设置图片的方法最后都会走这个方法所以从这里面可以检索出bitmap出来最后在onDraw对大图进行处理,如果图片不超过范围直接调用父类的就行,解释不太多情包涵内容都写了注释大概都看得懂

 

目前显示图片都要借助第三方图片加载框架,因为我也没对布局和测量方法进行处理,但是第三方框架基本都会根据图片调整图片的大小所以我也没考虑view的尺寸大小动态调整问题,固定宽高的尺寸不受影响。

此自定义控件可以当做普通的imageView处理,只是做了对大图的处理所以原imageView没有任何影响,小弟不才觉得代码可以优化的也可以通知我一声哦,这里是本人开始的第一份博客希望大家点赞!!!!

 

具体事例,比如Glide加载!

final SuperLongImageView imageView = (SuperLongImageView) helper.getView(R.id.image);

String imgUrl="网络地址或者本地图片地址";
Glide.with(BiNiuApplication.getContext())
        .load(imgUrl)
        .into(imageView);

 

 

/**
 * @author 李泽锋
 * @Description:
 * @date 2018年07月20日-16时25分   长图自定义控件,可以很好的和glide结合使用
 */
public class SuperLongImageView extends android.support.v7.widget.AppCompatImageView {

    private Bitmap bitmap;
    private int mode;

    public SuperLongImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        int maximumBitmapHeight = canvas.getMaximumBitmapHeight();
        if (bitmap == null || bitmap.getHeight() < maximumBitmapHeight&&mode!=MeasureSpec.UNSPECIFIED) {   //如果bitmap小于手机限制的最大值则走父类
            super.onDraw(canvas);
        } else {
            int currentviewHeight = 0;
            canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));  //设置抗锯齿
            int be = bitmap.getHeight() / maximumBitmapHeight;   //按限制大小分割分数
            int yu = bitmap.getHeight() % maximumBitmapHeight;   //切割剩余部分尺寸
            for (int i = 0; i < be; i++) {  //将分数重新封装成bitmap画到布局上
                Bitmap bmp = Bitmap.createBitmap(bitmap, 0, maximumBitmapHeight * i, bitmap.getWidth(), maximumBitmapHeight);
                Rect bitmaprect = new Rect(0, 0, bmp.getWidth(), bmp.getHeight());
                currentviewHeight=(int) (( bmp.getHeight() / ((float)bmp.getWidth())) * getWidth());
                Rect viewrect = new Rect(0, currentviewHeight*i, getWidth(),currentviewHeight*(i+1));
                canvas.drawBitmap(bmp, bitmaprect, viewrect, null);
            }
            //将余下部分画到布局上!!!
            Bitmap bmp = Bitmap.createBitmap(bitmap, 0, maximumBitmapHeight * be, bitmap.getWidth(), yu);
            Rect bitmaprect = new Rect(0, 0, bmp.getWidth(), bmp.getHeight());
            Rect viewrect = new Rect(0, currentviewHeight*be, getWidth(), currentviewHeight*be + (int) (( bmp.getHeight() / ((float)bmp.getWidth())) * getWidth()));
            canvas.drawBitmap(bmp, bitmaprect, viewrect, null);
        }


    }


    @Override
    public void setImageDrawable(@Nullable Drawable drawable) {
        try {
            //检索对象中的bitmap并赋值给全局变量
            Field[] declaredFields = drawable.getClass().getDeclaredFields();
            for (Field f : declaredFields) {
                f.setAccessible(true);
                Object o = f.get(drawable);
                if (o == null) {
                    continue;
                }
                Field[] declaredFields1 = o.getClass().getDeclaredFields();
                for (Field c : declaredFields1) {
                    c.setAccessible(true);
                    Object obj = c.get(o);
                    if (obj != null &&  obj instanceof Bitmap) {
                        bitmap = (Bitmap) obj;
                        throw new Exception();
                    }
                }
            }
            super.setImageDrawable(drawable);
        } catch (Exception e) {
            super.setImageDrawable(drawable);
        }


    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mode = MeasureSpec.getMode(heightMeasureSpec);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

上传了个DEMO 大家可以下载调试或者优化下,本人测试过很多次没问题,可以当做普通 imageview使用

 

下载地址

https://download.csdn.net/download/lizefeng19/10772153

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值