Android屏幕适配之固定宽高比

Android屏幕适配 Android屏幕适配方案 阅读详情

图形自己的宽高比不等于控件的宽高比造成了显示的时候图片的变形.
以最常见的情况为例:
已知条件:图片的宽高比,控件的的宽度(match_parent)
解决办法:让图片宽高比等于控件宽高比,自定义一个Layout控件

package com.example.administrator.example.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;


/**
 * 作者:Created by Kevin on 2016/2/1.
 * 邮箱:
 * 描述:固定宽高比的控件
 */
public class RatioLayout extends FrameLayout {

    private float mPicRitio = 2.4f; //一个固定的宽高比,后面创建属性自定义来设置宽高比
    public RatioLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RatioLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //父控件是否是固定值或者是match_parent
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        if (mode == MeasureSpec.EXACTLY){
            //得到父容器的宽度
            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            //得到子控件的宽度
            int childWidth = parentWidth - getPaddingLeft() - getPaddingRight();
            //计算子控件的高度
            int childHeight = (int) (childWidth / mPicRitio +0.5f);
            //计算父控件的高度
            int parentHeight = childHeight + getPaddingBottom() + getPaddingTop();

            //测量子控件,固定孩子的大小
            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
            measureChildren(childWidthMeasureSpec,childHeightMeasureSpec);
            //测量
            setMeasuredDimension(parentWidth,parentHeight);

        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

    }
}

然后在我们布局文件中调用

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:background="@drawable/selector_item_appinfo_bg"
        android:orientation="vertical"
        android:padding="10dp">


        <com.example.administrator.example.views.RatioLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/iv_icon"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </com.example.administrator.example.views.RatioLayout>

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title" />
    </LinearLayout>

</FrameLayout>

这样我们现实的图片就是以一个固定宽高比来显示的,不会因为图片的大小造成显示的不同。在类RatioLayout 中我们固定了宽高比mPicRitio = 2.4f,我们更希望在布局文件中可以自定义该值
所以创建attrs。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="RatioLayout">
        <attr name="picRatio" format="float"/>
    </declare-styleable>
</resources>

修改布局文件以及添加自定义命名空间

<com.example.administrator.googleplay.views.RatioLayout
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:picRatio="3.55"
            >

最后在RatioLayout 的构造函数中获取

    public RatioLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
        mPicRitio = typedArray.getFloat(R.styleable.RatioLayout_picRatio,0);

        typedArray.recycle();
    }

    public RatioLayout(Context context) {
        this(context, null);//这样都会走到上一个构造函数
    }
Android屏幕适配全方案实战指南 Android屏幕适配是一场永无止境的修行。新的设备形态(折叠屏、卷轴屏)、新的交互方式(手势导航、多窗口)、新的开发范式(Compose)不断涌现。但我们不必恐惧。只要掌握了dp/sp的核心原理,理解了资源系统的匹配机制,熟练运用现代化的布局工具,并建立起完善的团队治理体系,我们就能以不变应万变。记住,好的适配不是让界面在每一台设备上都“一模一样”,而是让每一位用户,无论使用什么设备,都能获得一致、舒适、无障碍的体验。这才是我们追求的终极目标。🚀。 阅读详情

相关推荐

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 213

Android 设置ImageView宽度固定,其高度按比例缩放适应

今天和项目经理对喷了一下,他说在应用的列表数据中的图片应该宽度固定,高度按比例缩放自适应,我说,那岂不是很丑!直接让运营那边把图片处理成固定宽高比不就好了,省的我客户端麻烦了。 这家伙不同意,为毛呢,因为我们公司的图片尼玛全部是从别的网站上荡过来的,几万张图片,本身不知道图片宽度和高度。。。。我日。。。。 好吧,既然提出了这么个需求,那我就实现...

weixin_33716154的博客 2664

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 551

Android 自定义imageview图片高度固定大小宽度按比例自适应

package com.common.common.wediget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import andr

dst123965的博客 2931

【SystemVerilog项目实践】4.AHB-SRAMC(验证计划)

验证计划

托马斯的博客 3659

大模型量化方法总结

本文主要对大模型量化方法进行了总结,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型精度 3. 量化方法 3.1 方法一 3.2 方法二 3.3 方法三

herosunly的博客 1万+

Android 实现自定义宽高比的ImageView

前言我们为什么要用到宽高比固定的ImageView呢?因为Android屏幕大小不一样,同样一张图片可能会在不同的设备上显示效果不同,会发生拉伸等情况。今天就来说一种解决方案,让图片的宽高比固定,保证不变形。为了实现这个效果,我们需要自定义一个ImageView。思路根据这个ImageView的宽度或者高度去设置,分以下几种情况: 1.宽度确定,高度不确定,通过宽度设置高度 2.高度确定,宽度不

Small_Lee的博客 8099

YOLOv11的网络结构概览(Backbone-Neck-Head):介绍骨干网络(Backbone)、特征融合层(Neck)和检测头(Head)的作用

YOLOv11架构解析:从特征提取到目标检测 YOLOv11继承了YOLO系列的经典三组件架构,包含Backbone、Neck和Head三部分。Backbone基于改进的CSPDarknet,通过Conv和C3模块进行多尺度特征提取;Neck采用FPN+PAN结构融合不同层次特征;Head负责检测任务输出。网络整体设计注重高效性和多尺度特征融合,采用C3模块优化信息流和梯度流,配合SPPCSPC增强特征表达能力。该架构在保持实时检测速度的同时,提升了目标检测精度,体现了YOLO系列"一次看全图&q

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1万+

分享一个 Android 尺寸限制组件:限制最大高度、按宽高比限制宽度或高度

一、说明 你是否有遇到过以下需求: 底部弹窗的高度为自适应,但最大不能高于 200dp,如果能有一个 maxHeight 属性该多好。但这个属性貌似只在 TextView 有发现,其它 View 就不支持了。 图片的宽度为屏幕宽度,图片的高度为按设计图尺寸自适应。 或者图片的高度固定,按一定比例自适应宽度。 以上的这些需求,Android 原生没有直接的属性支持。当然,你也可以每次去计算,但这样太费事了,如果能封装一个组件达到一劳永逸是不是会方便很多呢。 二、实现逻辑 1、在style.xml.

Eric的博客 3010

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1981

使用RV1126实现人脸识别——将Facenet模型转换为RKNN模型

在本文中,我们将探讨如何在RV1126芯片上实现人脸识别,并将Facenet模型转换为RKNN(Rockchip Neural Network)模型,以在RV1126上进行高效的人脸识别。Fine-tuning是指在预训练模型的基础上,使用自己的数据集进行进一步训练,以适应特定的任务。同时,我们需要下载Facenet模型的预训练权重,这些权重将作为我们的基础模型。综上所述,我们详细介绍了如何在RV1126上实现人脸识别,并将Facenet模型转换为RKNN模型。方法将模型导出为RKNN格式的文件。

code_program481的博客 1522

Android中如何使控件保持固定宽高比

目录 1、自定义view 2、adjustViewBounds 3、百分比布局 4、ConstraintLayout 我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但是组件本身大小却不定。尤其在android屏幕碎片化的情况下,很多时候我们需要让一个组件宽度与屏幕宽度一致,这样就无法确定宽度。那么如何让控件保持固定宽高比?有几种方法供大家选择。 1、自定义view 自定义view,重写onMeasure或onLayout等相关方法,通过预定的比例计算宽

公众号:BennuCTech 1万+

ESP32-C3入门教程 问题篇⑳——subprocess.CalledProcessError: Command ‘[‘D:\\.espressif\\python_env\\idf5.4_py3.

ESP32-C3入门教程 问题篇⑳——subprocess.CalledProcessError: Command '['D:\\.espressif\\python_env\\idf5.4_py3.

770

android布局自动缩放比例,android布局缩放,固定宽高比在不同的手机上

我有一个内部有两个ImageView的布局.每个图像具有固定的宽高比,例如第一图像是320×160,第二图像是320×320.布局垂直对齐.我希望将这两个图像粘合在一起并缩放以适合屏幕两侧(宽度或高度),并在另一侧进行缩放.我尝试使用scaleType = fitCenter,但问题是在不同宽高比的手机上,图像不在一起,它们之间有黑色区域.似乎我不能使用布局:重量,因为屏幕有不同的比例(480×8...

weixin_36215861的博客 724

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 获取屏幕宽度_React Native 屏幕适配

React Native 屏幕适配开发APP(包括H5)都面临一个问题,怎么适配各种尺寸的屏幕?H5方案:等比例缩放在移动端的web页面适配上,我们采用的是手机淘宝出的 lib-flexible 方案,大部分情况下,rem 一把梭,基本上解决了屏幕适配问题。在 React Native的页面布局里,也很自然想到使用类似的方案,根据当前屏幕宽度,计算出应该显示的尺寸,梭哈即可。然鹅,在和UE同学确认...

weixin_39640372的博客 252

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android 屏幕适配全指南:从基础原理到折叠屏适配实战

本文全面解析Android屏幕适配的技术要点,从基础概念到进阶方案。首先明确屏幕尺寸、分辨率、密度等核心参数,强调必须使用dp/sp单位避免固定尺寸。基础适配方案包括:灵活使用ConstraintLayout和LinearLayout权重、布局复用与变体、多密度图片资源和矢量图。进阶部分涵盖折叠屏形态变化处理、平板双窗格布局、横竖屏切换适配以及全面屏刘海区域规避。最后推荐采用Android Studio工具测试,并提出适配最佳实践:优先相对布局、避免固定尺寸、资源分类清晰、动态适配优先。开发者需根据不同设备

weixin_37794278的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

安卓屏幕适配

1.屏幕适配使用头条的解决方案 在gradle导入AndroidAutoSize api 'me.jessyan:autosize:1.1.2' 在manifest的application节点下配置ui给的分辨率,这样子最基本的配置就配置完了,由于目前不需要特殊处理,所以就不配置其他的东西 2.字体大小适配 由于华为的字体普遍大,所以需要适配下字体不随系统的设置而变化,...

qq_33468215的博客 239

自定义布局之宽高比布局的实现

最近在项目中遇到一个屏幕适配的问题,在显示图片时我在布局中宽度和高度都设置了固定的dp值,但当app运行在一些屏幕比较宽的手机上时,会出现图片宽高比不对情况,因为宽屏的手机横向的像素密度比较大,为此在网上找到一个解决方案是,定义一个可以根据图片本身宽高比来设置控件宽高的布局。实现如下 首先声明两个属性,一个是picRatio表示图片的宽高比,一个是relative表示要根据宽度按比例确定高度,还

sutao1994 1063

今日头条的Android屏幕适配方式

转自:一种极低成本的Android屏幕适配方式 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。   一、传统dp适配方式的缺点 android中的dp在渲染前会将dp转为px,...

songzi1228的博客 724

day 15-16 面试题:Android屏幕适配

面试题: 1. Android屏幕适配 1. 说说安卓的一些屏幕单位 2. 谈谈你项目中的一些屏幕适配的经验 3. 今日头条轻量级适配方案了解吗?给我说说原理 1. Android屏幕适配 1.1 说说安卓的一些屏幕单位 px:像素,屏幕上的一个像素点 dpi:一英寸的像素的点数,安卓中取 160像素/英寸 为标准dpi density:像素密度: 屏幕dpi/标准dpi dip(...

听风-Android进阶 589

Android学习之屏幕适配(非原创)

原文地址: https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA 其他参考: Android开发:最全面、最易懂的Android屏幕适配解决方案 Android官方提供的支持不同屏幕大小的全部方法 Android 屏幕适配方案 正文 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探

qq_44375666的博客 247

Android屏幕适配全解析:从dp/sp原理到ConstraintLayout实战

在移动应用开发中,多屏幕适配是确保应用在不同设备上提供一致用户体验的核心技术挑战。其原理基于理解屏幕分辨率、物理尺寸与像素密度(DPI/PPI)的三角关系,Android系统通过密度桶机制将设备归类,并使用密度无关像素(dp)和缩放无关像素(sp)作为基础单位来实现尺寸与字体的相对适配。这项技术的价值在于解决Android生态严重的碎片化问题,使应用能优雅运行于从720P到2K、从传统屏到折叠屏的海量设备上。在实际应用场景中,开发者需要掌握从基础单位转换到高级弹性布局(如ConstraintLayout)的

weixin_30905981的博客 520

Android 屏幕适配

Android 屏幕适配 常见方案 限定符适配 尺寸限定符 限定符 描述 layout-small 小屏幕 layout-normal 基准屏幕 layout-large 大屏幕 layout-xlarge 超大屏幕 屏幕方向限定符 限定符 描述 layout-land 横向 layout-port 纵向 分辨率限定符 限定符 描述 ...

xyTianZhao 408

Android屏幕适配讲解和实战

一、为什么要屏幕适配 基础: 1、dpi:屏幕像素密度,指的是在系统软件上指定的单位尺寸的像素数量,它往往是写在系统出厂配置文件的一个固定值; 2、ppi:也是屏幕像素密度,但这个是物理上的概念,它是客观存在的不会改变。dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值; 3、dp加上自适应布局和weight比例布局能解决90%的适配问题。因为并不是所有的1080P的手机dpi都是480,比如Google 的Pixel2(1920*1080)的dp

u013750244的博客 588
上一篇: ViewPager相互嵌套,里层ViewPager无法滑动的解决方法
下一篇: Android之代码设置selector
Exception灬
博客等级 码龄11年 11粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值