Android 实现自定义宽高比的ImageView
-
前言
我们为什么要用到宽高比固定的ImageView呢?因为Android屏幕大小不一样,同样一张图片可能会在不同的设备上显示效果不同,会发生拉伸等情况。今天就来说一种解决方案,让图片的宽高比固定,保证不变形。为了实现这个效果,我们需要自定义一个ImageView。
思路
根据这个ImageView的宽度或者高度去设置,分以下几种情况:
1.宽度确定,高度不确定,通过宽度设置高度
2.高度确定,宽度不确定,通过高度设置宽度
3.宽高都确定,无需设置,因为设置没效果
4.宽高都不确定,无法设置宽高比代码
我们先在styles.xml中自定义属性
<declare-styleable name="MyImageView"><attr name="ratio" format="float"/></declare-styleable>
- 1
- 2
- 3
然后我们在自定义View中去获取这个属性:
public class MyImageView extends ImageView {//宽高比,由我们自己设定private float ratio;public MyImageView(Context context, AttributeSet attrs) {super(context, attrs);//获得属性名称和对应的值 // for (int i = 0; i < attrs.getAttributeCount() ; i++) {// String name = attrs.getAttributeName(i); // String value = attrs.getAttributeValue(i); // System.out.println("====name: "+name+"value:"+value); // }TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyImageView);//根据属性名称获取对应的值,属性名称的格式为类名_属性名ratio = typedArray.getFloat(R.styleable.MyImageView_ratio, 0.0f);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//获取宽度的模式和尺寸int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);//获取高度的模式和尺寸int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);//宽确定,高不确定if(widthMode == MeasureSpec.EXACTLY&&heightMode!=MeasureSpec.EXACTLY&&ratio!=0){heightSize = (int) (widthSize*ratio+0.5f);//根据宽度和比例计算高度heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);}else if(widthMode!=MeasureSpec.EXACTLY&&heightMode==MeasureSpec.EXACTLY&ratio!=0){widthSize = (int) (heightSize/ratio+0.5f);widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize,MeasureSpec.EXACTLY);}else{throw new RuntimeException("无法设定宽高比");}//必须调用下面的两个方法之一完成onMeasure方法的重写,否则会报错 // super.onMeasure(widthMeasureSpec,heightMeasureSpec);setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);}/*** 设置宽高比* @param ratio*/public void setRatio(float ratio){this.ratio = ratio;} }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
最后我们在布局文件中使用这个自定义的ImageView
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:custom="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:gravity="center"tools:context="com.example.hecun.testone.MainActivity"><com.example.hecun.testone.MyImageViewandroid:id="@+id/imageview"android:layout_width="150dp"android:layout_height="wrap_content"android:src="@drawable/ym1"custom:ratio="1"android:scaleType="fitXY"/> </LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
我们在这里设置了宽高比为1,我们来看看效果:
顺便给出ratio为2和3时的效果图
Android 实现自定义宽高比的ImageView相关推荐
- html容器自定义宽高比,容器长宽比_aspect-ratio, 宽高比, 会员专栏 教程_W3cplus
容器长宽比,这个话题在站上也有相关的文章介绍,最早出现于Responsive Web Design中,主要用来处理img.iframe.video和object这些元素的自适应问题.简单点讲,就是根据 ...
- android文字与图片底部对齐,ImageView 图片和 TextView 文字的底部对齐
有时我们需要做到大文字小图片在一行显示,并且图片跟文字的底部对齐,如图: 以 RelativeLayout 为例: 1. 当 ImageView 设置了 alignBottom 属性,对齐的方式是这样 ...
- Android中如何使控件保持固定宽高比
目录 1.自定义view 2.adjustViewBounds 3.百分比布局 4.ConstraintLayout 我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但 ...
- Android O 自定义通知实例及一个自定义自动适配缩放图片至特定大小的田字格ImageView
这一篇博文的思路很简单,没有什么深入的理论,源由是最近在实习公司里开发用到了Android O的通知,发现与以往有所不同,相关的资料是有,但是大部分都不适用于这个版本,这里只是写一个非常简单的Demo ...
- android 怎么固定控件,Android中如何使控件保持固定宽高比
我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但是组件本身大小却不定.尤其在android屏幕碎片化的情况下,很多时候我们需要让一个组件宽度与屏幕宽度一致,这样就无法 ...
- android设置高度比例,Android控件设置宽高比的方法
0. 困扰很久的问题 Android控件的宽和高保持比例,这是从我接触Android以来,一直不断会遇到的需求.以前,要么就是在代码里直接设置宽和高,要么就是自定义控件.网上也有开源的自定义ViewG ...
- android xml图片缩放,Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码...
概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放. /** * 自定义的ImageView控制,可对图片进行多点触控缩放和拖动 * * @author qiuwan ...
- android mp4宽高,Android:MediaPlayer视频宽高比问题
我遇到了一个我无法解决的问题.我正在使用MediaPlayer类来播放视频;但是,我总是失去原有的宽高比.这里提到了媒体播放器代码和xml代码.我尝试了很多东西,但仍然无法解决问题.我需要保持原始的宽 ...
- android 自定义圆形pop,Android布局自定义Shap圆形ImageView可以单独设置背景与图片...
一.图片预览: 一.实现功能: 需求要实现布局中为圆形图片,图片背景与图标分开且合并到一个ImageView. 二.具体实现: XML中布局中定义ImageView,关健设置两个参数 Android: ...
最新文章
- 【数据结构】之基本概念和术语
- Java数字图像处理基础知识 - 必读
- mysql into_MYSQL中replace into的用法
- Form.php 日期表单,Bootstrap日期和时间表单组件使用方法
- 2021 年前端趋势预测
- 集成方法(随机森林)
- 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(3)--(P3P的迭代解)
- 天河一号超级计算机研制成功,我国首台千万亿次超级计算机“天河一号”研制成功,其运..._简答题试题答案...
- 超链接把一个值传到多个页面的方法
- C# Thread.Sleep 导致内存溢出,在多线程里Sleep的真实情况 软件闪退 内存溢出
- 半导体物理学习记录——概述
- 原理 + 代码:手把手教你使用 Python 实战反欺诈模型
- python django 商品进销存管理系统(毕设、课设、学习)
- x265码率控制-VBV更新过程
- linux xv命令什么意思,Linux部分命令解释(命令缩写代表什么意思)
- RMAN-20003错误
- 程序员应当正确突破英语障碍
- 组态基于DTU实现机床远程监控系统
- Zookeeper(五)Watcher机制
- Unity使用AVProVideo播放透明视频
热门文章
- 最新超详细VMware虚拟机下载与安装(一篇足以带你上高速,附钥)
- C++async、future、packaged_task、promise的使用
- linux下ftp命令输出日志,ftp中/var/log/xferlog日志解析及ftp常用命令常用
- Spring Boot配置Tomcat容器、Jetty容器、Undertow容器
- Domoticz添加实时天气信息显示
- 如何画出漂亮的神经网络图?
- poj2187 旋转卡(qia)壳(ke)
- Large scale GAN training for high fidelity natural image synthesis解读
- 怎样用html制作歌词字幕,爱剪辑可以制作歌词字幕吗 教你用爱剪辑加歌词字幕的方法--系统之家...
- 计算机中没有汉字输入,电脑没有了输入法无法输入汉字,是为什么??