首页 > 其他分享 >Android ImageView 图片自适应问题记录

Android ImageView 图片自适应问题记录

时间:2023-06-19 11:32:34浏览次数:33  
标签:return 记录 int height context import ImageView Android android


困惑了一周的问题,imageview里的图片是后端返回的,包括返回了图片的宽高,开始利用layoutpararams代码里设置了,不清楚为什么没有生效,后来就忘记优化了。在上线前夕,产品提出了这个优化点,满头雾水。当时想的是有没有可能是后端返回的图片的问题,(产品说ios是好的)。。。。无语(自己技术太菜)
没办法硬着头皮搞

<ImageView
        android:id="@+id/dod_image"
        android:layout_width="@dimen/dp_73"
        android:layout_height="@dimen/dp_29"
        android:background="@drawable/drawable_dod_backgroud"
        android:paddingVertical="@dimen/dp_7"
        android:paddingHorizontal="@dimen/dp_9"
        android:scaleType="fitCenter"
        android:adjustViewBounds="true"
        app:layout_constraintTop_toTopOf="@id/iv_class_bg"
        app:layout_constraintStart_toStartOf="@id/iv_class_bg"
        />

scaleType

网上大多数多要用这个方法,我也设置了,就是不好使,感觉还是得从代码里设置,于是再次调用了layoutParams

holder.getView<ImageView>(R.id.dod_image)?.apply {//layoutParams的单位为px 后端返回的为dp,需要借助ScreenUtils转换
                  var params=this.layoutParams
                  params.height=bean.gradeImgHeight
                  params.width= bean.gradeImgWidth
                  this.layoutParams=params
              }

这个是第一反应写出的代码,我靠!!!不行啊,显示出来的图片就一点点,
这是为啥啊,百思不得其解,于是我就把xml里的宽高都设置为0,layoutparams里的宽高设置为ui给出的宽高,好家伙,还是不行,但是明显的看出不是layoutparams没生效,而是值不对,于是再次点开了layoutparams源码
发现了事情的缘由

layoutparamt的单位是px!!!!!不是dp

holder.getView<ImageView>(R.id.dod_image)?.apply {//layoutParams的单位为px 后端返回的为dp,需要借助ScreenUtils转换
                  var params=this.layoutParams
                  params.height=com.app.hubert.guide.util.ScreenUtils.dp2px(context,bean.gradeImgHeight+14)
                  params.width= com.app.hubert.guide.util.ScreenUtils.dp2px(context,bean.gradeImgWidth+18)
                  this.layoutParams=params
              }

借助转换工具转换一下就好了

package com.app.hubert.guide.util;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.ViewConfiguration;

/**
 * Created by hubert
 * <p>
 * Created on 2017/7/27.
 */
public class ScreenUtils {

    private ScreenUtils() {
        throw new AssertionError();
    }

    /**
     * dp单位转成px
     *
     * @param context context
     * @param dp      dp值
     * @return px值
     */
    public static int dp2px(Context context, int dp) {
        return (int) (dp * context.getResources().getDisplayMetrics().density);
    }

    /**
     * 获取屏幕宽度
     */
    public static int getScreenWidth(Context context) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return dm.widthPixels;
    }

    /**
     * 获取屏幕高度
     */
    public static int getScreenHeight(Context context) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return dm.heightPixels;
    }

    /**
     * 获取状态栏高度
     */
    public static int getStatusBarHeight(Context context) {
        // 一般是25dp
        int height = dp2px(context, 20);
        LogUtil.i("common statusBar height:" + height);
        //获取status_bar_height资源的ID
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            height = context.getResources().getDimensionPixelSize(resourceId);
            LogUtil.i("real statusBar height:" + height);
        }
        LogUtil.i("finally statusBar height:" + height);
        return height;
    }

    /**
     * 虚拟操作拦(home等)是否显示
     */
    public static boolean isNavigationBarShow(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point size = new Point();
            Point realSize = new Point();
            display.getSize(size);
            display.getRealSize(realSize);
            return realSize.y != size.y;
        } else {
            boolean menu = ViewConfiguration.get(activity).hasPermanentMenuKey();
            boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
            if (menu || back) {
                return false;
            } else {
                return true;
            }
        }
    }

    /**
     * 获取虚拟操作拦(home等)高度
     */
    public static int getNavigationBarHeight(Activity activity) {
        if (!isNavigationBarShow(activity))
            return 0;
        int height = 0;
        Resources resources = activity.getResources();
        //获取NavigationBar的高度
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0)
            height = resources.getDimensionPixelSize(resourceId);
        LogUtil.i("NavigationBar的高度:" + height);
        return height;
    }
}

这是工具类没事了,吐槽完毕拜拜

标签:return,记录,int,height,context,import,ImageView,Android,android
From: https://blog.51cto.com/u_16163442/6512054

相关文章

  • Android屏幕适配的几种方案
    前言由于Android设备存在有不同的屏幕尺寸,屏幕分辨率,像素密度,Android应用在开发的过程必须要考虑到屏幕尺寸适配的问题,以保证在不同尺寸的Android设备上都能够正常运行。我们需要利用适配这一个过程把同一张原型图设计的样式尽可能以同样地视觉效果呈现在不同地屏幕上。适配核心问......
  • android连接本地数据库sqlite,实现增删改查
    前言Android应用数据存储简单来说有这么几种:文件存储、SharedPreference存储、SQLite数据库存储、网络服务器存储、ContentProvider等。如果需要存储的数据量大的时候,那么使用文件存储会有很大的弊端,例如:你想修改其中很微小的项就要先读取整个文件的内容,修改后再全部保存,非常耗时。......
  • 2023-06-19 uniapp云打包报错:app-plus.distribute.icons.android.hdpi 文件不存在
    详细报错:[HBuilder]11:02:51.408Manifest.json文件以下节点配置错误,请检查修复[HBuilder]11:02:51.408app-plus.distribute.icons.android.hdpi 文件不存在[HBuilder]11:02:51.408app-plus.distribute.icons.android.xxhdpi 文件不存在[HBuilder]11:02:51.408ap......
  • 一文带你了解Android IO的底层原理
    前言最近在看《Linux内核设计与实现》的时候,就想着要不把知识串联一下吧。聊什么呢?今天先来聊聊AndroidIO的调用链路。说起IO,这可真是一个很复杂的过程,里面涉及了很多内容,先是软件,最后到硬件,用一张图来表示一下吧:本文打算简单得和大伙讨论一下IO的流程。一、应用层作为应用开......
  • Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救
    作者:唐子玄MVI架构有三大关键词:“唯一可信数据源”+“单向数据流”+“响应式编程”,以及一些关键概念,比如Intent,State。理解这些概念之后,能更轻松地阅读本文。(强烈建议从第一篇开始阅读)引子在上一篇中,用MVI重构了“新闻流”这个业务场景。本篇在此基础上进一步拓展,引入MVI中......
  • 干了8年Android开发熬到年薪40万,突然接到被辞退消息,应该怎么办?
    0136岁Android开发,为公司工作8年,昨天HR说公司不准备续约前天晚上,有个读者给我留言,讲述了他自己比较气愤的一件事,感觉自己委屈又不值。这位朋友不愿意透露姓名,就叫他H先生吧。H先生是典型的学霸,大学也是211的牌子,又是计算机专业。研究生毕业以后就进入了现在的公司当了一名Android......
  • 方法对了,你做1年Android开发能顶别人做10年
    前几天后台有读者问我这样的问题。他在一家互联网公司工作3年了,每天都很忙,事情又多又杂。本想着学习多一些东西也不是坏事,可到头来一无所获,什么都没学会,满腔的热情也被消磨得差不多。三天两头动辞职的念头,但又不知道自己还能做什么,甚至开始后悔:如果当初选择另一个行业,是不是就会好......
  • 做Android开发,你后悔过吗?
    有同学跟我说,编程太难了,总是有学不完的技术、框架,新技术也层出不穷,马上三十了,还有各种学不完的东西,后悔做程序员了编程对我来讲,还难吗我主业是做Android的。我刚学编程的时候,觉得难点在于众多语法/API的学习,以及抓耳挠腮、苦思冥想捉bug的无奈。但无论语法多么复杂难用,终究会有学会......
  • 阿里钉钉Android实习面试也太太太太难了吧,对算法的要求堪比字节
    本人研究生在读,在2月26日找了师兄内推阿里钉钉团队,28号接到了约1面的电话。幸好我提前准备了一个多月的样子,刷面试题、刷LeetCode(面了之后才觉得自己刷少了),对于我这样一个实习生来说题目还是有些偏难,不过在4月20号终于拿到意向书了,听内推人说阿里实习面试没有rank,可能单纯就是流程......
  • 大厂技术总监总结的Android Framework开发笔记火了!知乎已1.7k赞!不吃透都对不起他
    为什么要学AndroidFramework?想要成为一名优秀的Android开发,就需要有一个完备的知识体系,AndroidFramework的知识是很重要的一个组成部分,他广泛的应用在各个领域。像掉帧监控,函数插装,慢函数检测,ANR监控,启动监控,都需要对Framework有比较深入的了解。只有这样才能知道怎么去做监......