Android在RecyclerView中进行图片宽度铺满屏幕高度自适应

Android在RecyclerView中进行图片宽度铺满屏幕高度自适应

这个单纯是用来记东西的,以下代码都是在网上找到并进行微改。原作者我找不到了。我是在商品的详情页面使用

以下代码在自定义的Adapter中加载
imageDrawable是为了方便在本地进行演示加上的,如果要通过网络获取图片就改类型

    public void imageWidth(final Drawable imageDrawable,final ImageView imageView){

        //这里是先获取屏幕的宽高,然后把屏幕的宽设为imageView的宽。

        Log.i(getSystemService(Context.WINDOW_SERVICE)+"================","-----"+getPackageName());

        WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

        int width = wm.getDefaultDisplay().getWidth();

        System.out.println("---------------"+width);

        int height = wm.getDefaultDisplay().getHeight();

        ViewGroup.LayoutParams params = imageView.getLayoutParams();

        params.width= width;

        imageView.setLayoutParams(params);


        System.out.println(imageView.getWidth()+"----------123=============="+imageDrawable);
        Glide.with(this).load(imageDrawable).listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                if(imageView==null) {
                    return false;

                }

                //首先设置imageView的ScaleType属性为ScaleType.FIT_XY,让图片不按比例缩放,把图片塞满整个View。

                if(imageView.getScaleType() != ImageView.ScaleType.FIT_XY) {

                    imageView.setScaleType(ImageView.ScaleType.FIT_XY);

                }

                //得到当前imageView的宽度(我设置的是屏幕宽度),获取到imageView与图片宽的比例,然后通过这个比例去设置imageView的高

                ViewGroup.LayoutParams params =imageView.getLayoutParams();

                
				//这里有一个问题当你第二次调用时ImageView.getWidth为0,目前还没有找到解决方案。如果你解决了。能否告诉我一声
             	System.out.println(imageView.getWidth()+"========="+imageView.getPaddingLeft()+"==========="+imageView.getPaddingRight());
                
                int vw =imageView.getWidth() -imageView.getPaddingLeft() -imageView.getPaddingRight();

                float scale = (float) vw / (float) resource.getIntrinsicWidth();

                int vh = Math.round(resource.getIntrinsicHeight() * scale);

                System.out.println("======="+vh+imageView.getPaddingTop()+imageView.getPaddingBottom());
                params.height= vh +imageView.getPaddingTop() +imageView.getPaddingBottom();

                imageView.setLayoutParams(params);

                return false;
            }
        }).into(new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                imageView.setImageDrawable(resource);
            }
        }); //加载图片

    }

布局文件
如果不需要在RecyclerView中进行宽度铺满高度自适应,以下布局文件就可

    <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"/>

修改第二次调用不显示图片问题

final ViewGroup.LayoutParams params =imageView.getLayoutParams();

                    ViewTreeObserver viewTreeObserver = imageView.getViewTreeObserver();
                    viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                           
                            int vw =imageView.getWidth() -imageView.getPaddingLeft() -imageView.getPaddingRight();

                            float scale = (float) vw / (float) resource.getIntrinsicWidth();

                            int vh = Math.round(resource.getIntrinsicHeight() * scale);

                            System.out.println("======="+vh+imageView.getPaddingTop()+imageView.getPaddingBottom());
                            params.height= vh +imageView.getPaddingTop() +imageView.getPaddingBottom();

                            imageView.setLayoutParams(params);
                        }
                    });

加入ViewTreeObserver的addOnGlobalLayoutListener方法。

借鉴的文章:
借鉴文章地址1
借鉴文章地址2

你可能感兴趣的:(Android在RecyclerView中进行图片宽度铺满屏幕高度自适应)