Android 优化广告图加载

java 复制代码
       Glide.with(context).asBitmap().load(url).into(new SimpleTarget<Bitmap>() {
           @Override
           public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
               imageView.setImageBitmap(resource);
           }

           @Override
           public void onLoadFailed(Drawable errorDrawable) {
               super.onLoadFailed(errorDrawable);
           }
       });

作用是:下载完成后,把图片显示在你广告图上,由于glide有三级缓存机制,因此,最好是提前在接口返回的时候,进行预加载,然后进入到广告启动的流程中的时候就可以直接复用上一次的bitmap,不会浪费相应的时间。因此思路如下:

接口数据--->开始预加载广告图---》loadSplash---〉加载广告图并且无兜底图

等宽显示广告图:

java 复制代码
    public static void scaleImage(final Activity activity, final ImageView view, Bitmap bitmap) {
        // 获取屏幕的高宽
        Point outSize = new Point();
        activity.getWindow().getWindowManager().getDefaultDisplay().getSize(outSize);

        // 解析将要被处理的图片
        final Bitmap resourceBitmap = bitmap;

        if (resourceBitmap == null) {
            return;
        }

        // 开始对图片进行拉伸或者缩放

        // 使用图片的缩放比例计算将要放大的图片的高度
        final int bitmapScaledHeight = Math.round(resourceBitmap.getHeight() * outSize.x * 1.0f / resourceBitmap.getWidth());

        // 以屏幕的宽度为基准,如果图片的宽度比屏幕宽,则等比缩小,如果窄,则放大
        final Bitmap scaledBitmap = Bitmap.createScaledBitmap(resourceBitmap, outSize.x, bitmapScaledHeight, false);
        //图宽度
        Log.e("MainActivity", "resourceBitmap.getHeight:" + resourceBitmap.getHeight());
        //图片高度
        Log.e("MainActivity", "resourceBitmap.getWidth:" + resourceBitmap.getWidth());
        //屏幕宽度
        Log.e("MainActivity", "outSize.x:" + outSize.x);

        //传入到下面的bitmap
        Log.e("MainActivity", "scaledBitmap.getHeight():" + bitmapScaledHeight);

        view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                try {
                    view.getViewTreeObserver().removeOnPreDrawListener(this);
                    //这里防止图像的重复创建,避免申请不必要的内存空间
                    if (scaledBitmap.isRecycled())
                        //必须返回true
                        return true;
                    // 当UI绘制完毕,我们对图片进行处理
                    int viewHeight = view.getMeasuredHeight();
                    //最终显示的图片
                    Bitmap finallyBitmap = null;
                    Log.e("MainActivity", "viewHeight:" + viewHeight);
                    //y + height must be <= scaledBitmap.getHeight()
                    if (scaledBitmap.getHeight() > viewHeight) {
                        int offset = (scaledBitmap.getHeight() - viewHeight) / 2;// 计算将要裁剪的图片的顶部以及底部的偏移量
                        int finallyBitmapHeight = scaledBitmap.getHeight() - (offset * 1); // 对图片以中心进行裁剪,裁剪出的图片就是非常适合做引导页的图片了
                        Log.e("MainActivity", "offset:" + offset);
                        Log.e("MainActivity", "finallyBitmapHeight:" + finallyBitmapHeight);
                        finallyBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), finallyBitmapHeight);
                    } else {
                        int finallyBitmapHeight = scaledBitmap.getHeight();
                        Log.e("MainActivity", "finallyBitmapHeight:" + finallyBitmapHeight);
                        finallyBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), finallyBitmapHeight);
                    }
                    if (null != finallyBitmap) {
                        if (!finallyBitmap.equals(scaledBitmap)) {//如果返回的不是原图,则对原图进行回收
                            scaledBitmap.recycle();
                            System.gc();
                        }
                    }
                    // 设置图片显示
                    view.setImageBitmap(finallyBitmap);
                } catch (Exception e) {
                    Log.e("MainActivity", "图片异常e:" + e.toString());
                }
                if (resourceBitmap != null && !resourceBitmap.isRecycled())
                    resourceBitmap.recycle();
                return true;
            }
        });
    }
java 复制代码
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, 
    DataSource dataSource, boolean isFirstResource) {
    // 得到当前imageView的宽度(我设置的是屏幕宽度),获取到imageView与图片宽的比例,然后通过这个比例去设置imageView的高
    ViewGroup.LayoutParams params = mAd.getLayoutParams();
    int vw = mAd.getWidth();
    float scale = (float) vw / (float) resource.getIntrinsicWidth();
    int vh = Math.round(resource.getIntrinsicHeight() * scale);
    params.height = vh;
    mAd.setLayoutParams(params);
    return false;
}

转自:Android 启动白屏优化及公告闪图秒加载 - 简书

相关推荐
alexhilton1 小时前
Kotlin互斥锁(Mutex):协程的线程安全守护神
android·kotlin·android jetpack
spencer_tseng3 小时前
Eclipse 4.7 ADT (Android Development Tools For Eclipse)
android·java·eclipse
archko5 小时前
android pdf框架-15,mupdf工具与其它
android·pdf
.豆鲨包7 小时前
【Android】MVP架构模式
android·架构
代码会说话8 小时前
i2c通讯
android·linux·嵌入式硬件·嵌入式
默|笙10 小时前
【c++】set和map的封装
android·数据库·c++
kaikaile199511 小时前
PHP计算过去一定时间段内日期范围函数
android·开发语言·php
2501_9293826511 小时前
电视盒子助手开心电视助手 v8.0 删除电视内置软件 电视远程控制ADB去除电视广告
android·windows·adb·开源软件·电视盒子
太过平凡的小蚂蚁11 小时前
Kotlin 异步数据流三剑客:Flow、Channel、StateFlow 深度解析
android·kotlin
铭哥的编程日记12 小时前
【Linux】库制作与原理
android·linux·运维