利用ViewPager显示banner的时候,一些人会直接写死ViewPager高度,比如在xml布局里面直接写成180dp。

这样的话,每个手机的宽度不同,viewpager里面内容的长宽比就不同,如果显示图片的话,里面的内容就很可能会变形。

本例在代码中动态设置ViewPager的高度,让他的高度始终和宽度呈固定比例。比如宽高比例是2:1,只要让后台配置的图片都是按2:1的话,图片显示就不会变形,体验明显提高一个档次。

本例将使用上一篇博客的代码,增加一些内容就行。上篇博客:Android ViewPager实现无限循环(2.加入小圆点,优化自动和手动滑动冲突)

布局基本没什么改变

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/rl_main"android:layout_width="match_parent"android:layout_height="wrap_content"><android.support.v4.view.ViewPagerandroid:id="@+id/vp_main"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:id="@+id/ll_main"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"android:gravity="center"android:orientation="horizontal" /></RelativeLayout>
</RelativeLayout>

再看看代码

private RelativeLayout mRelativeLayout;mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_main);/*** 动态设置代码高度* addOnPreDrawListener,顾名思义,在view要显示之前将会回调*/mRelativeLayout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {mRelativeLayout.getViewTreeObserver().removeOnPreDrawListener(this);ViewGroup.LayoutParams layoutParams = mRelativeLayout.getLayoutParams();layoutParams.height = (int) (mRelativeLayout.getWidth() / 2);mRelativeLayout.setLayoutParams(layoutParams);return true;}});

增加的内容也非常的少

注册一个监听器,在view要显示之前会回调他。在回调的时候,把view的宽度取出来,如果你的需求是高度为宽度的一半,就除了2。

注意:removeOnPreDrawListener一定要记得调用,不然会无限次的触发onPreDraw方法。

当然了,也有其它的方法,比如你直接获取手机屏幕的宽度,再除以2也行。

但是ViewPager不一定是横向铺满全屏,可能设置有margin个5dp之类的,你就要在代码中将dp转成px,再用屏幕宽度减去它。

或者一些时候view的宽高因为其它的一些原因而要在运行时才能确定的,但又要求要固定比例的时候,用这个方法就好解决了。

以下三张截图演示ViewPager不同margin情况时候的显示

当没有margin时

当左右margin都为30dp时

当左右margin为80dp时

可以看到ViewPager的宽度比高度都是2:1

最后再给个提示,onPreDraw方法里面不只是能够把自己的LayoutParams取出来,在保证其它view已经被系统设置好宽高的时候,也可以拿其它的view的LayoutParams来操作,比如可以拿他的父view,因为在子要显示之前,父view的宽高已经确定了(至少我目前用过的都是正确的)。

比如有一个需求,横着放三个按钮(或图片),三个按钮都是正方的,就像微信朋友圈、qq空间发9张图片的时候,一行是3张正方形且铺满屏幕的图片,就可以用这样的代码来做:

mChildView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {mChildView.getViewTreeObserver().removeOnPreDrawListener(this);ViewGroup.LayoutParams layoutParams = mChildView.getLayoutParams();// 让子view的宽度为父view的3分之1layoutParams.height = mParentView.getWidth() / 3;// 如果你的每两个相邻view的间隔是x大小的话,还要减去这个值
//                layoutParams.height = mParentView.getWidth() / 3 - 2 * x;mChildView.setLayoutParams(layoutParams);return true;}});

源码下载  点击打开链接

动态设置View的宽高、宽高比例(设置ViewPager的高度,宽高比例为2:1)相关推荐

  1. vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...

    由于图片的加载是在dom加载完成之后进行的,于是,在手机端浏览网页时,经常会看到页面刚打开时很多内容叠在一起,当图片加载完成后,页面会由于图片加载完成出现明显的抖动 针对这个问题,有以下几种解决方案 ...

  2. 代码 - 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf

    文章目录 1. 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高) 7.2.3版本 官方示例 多图合并成PDF   1. 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高) 7.2.3 ...

  3. html设置长宽高代码_html设置高等于宽

    做网页时,我们通常需要考虑到不同电脑屏幕尺寸,以及不同手机屏幕大小等问题,解决样式发生改变的情况,那么如何解决呢?现在主要是采用自适应来解决高度,宽度的,以及图片自适应问题,下面就PC端和移动端来总结 ...

  4. word如何设置长宽高_word怎样设置图片长宽

    Word2007提供了丰富的图片编辑功能,方便用户在不借助Photoshop等图片处理工具的情况下,直接在Word文档中对图片进行编辑.修改,甚至还可以为图片添加倒映.三维效果等.下面就来学习如何在W ...

  5. html中怎么写虚线框的宽高,html如何设置虚线边框

    网页布局中我们未来整体的网页美观我们可能需要设置虚线边框,但是你知道html如何设置虚线边框吗?本篇文章就来给大家介绍一下html设置虚线边框的方法. 用到CSS样式和HTML标签元素 为了对html ...

  6. vue图片宽高自适应_div或img图片高度随宽度自适应的方法

    该方法主要用来做网站自适应的,同时可以实现撑起内容高度,避免图片加载后导致的页面滚动. 一.可以使用js判断图片的宽度得到具体数值之后,再来利用js设置图片的高度(这里就不具体为大家细说了). 利用j ...

  7. 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )

    文章目录 一.获取图像真实宽高 二.计算解码区域 三.设置解码参数 内存复用 像素格式 四.图像绘制 五.执行效果 六.源码及资源下载 官方文档 API : BitmapRegionDecoder 在 ...

  8. Html百分比设宽偏差大,absolute和relative元素 设置百分比宽高的差异

    一般元素在页面所占的空间包括:magin border padding content.以前一直以为子元素设置百分比宽高都是以父元素的content值为基准计算的.但是当子元素的position不同时 ...

  9. canvas宽高设置

    canvas宽高设置 关于canvas宽高的设置,常见的方法有三种:1.直接设置<canvas>标签的width和height属性:2.通过css样式进行设置:3.通过js设置<ca ...

  10. Flutter设置Container的最大最小宽高

    Flutter中设置Container宽高可直接通过width和height属性来设置:如下 Container(width: 100,height: 100,color: Colors.red,ch ...

最新文章

  1. mysql.func_Mysqlfunc.c
  2. ORACLE SEQUENCE 介绍
  3. 基于python的图形化邮件发送程序(支持添加附件)
  4. php 自增,php 根据自增id创建唯一编号类
  5. 我发现一个新的软件,用自然语言编程!非常酷!
  6. python两列字符串合并_python两列字符串如何合并?
  7. C#中的DateTime:本周,本月,今年,本周
  8. 创朵计算机维修,创建第一个计算机监控软件服务
  9. 强制定义某个变量的内存地址
  10. 了区块链开放平台baas_区块链开放平台 BaaS 系统开发,区块链智能合约撰写服务...
  11. 【限时福利】COACKA免费试听@Days China,干货在这里!
  12. python小波包分解_Matlab小波包分解后如何求各频带信号的能量值?
  13. 计算机保研英语常见问题
  14. 战矛在线Java_战矛在线职业选择攻略 最强职业推荐
  15. Perl下载和安装Python下载和安装
  16. wsbm服务器错误怎么修复,如何使用ab测试上传文件
  17. Ubuntu与arm开发板之间构建NFS数据通道
  18. 大数据面试技巧——个人总结(持续更新)
  19. nginx降权及匹配php
  20. 栅格数据像元大小0.000几的处理方法或重采样失败显示像元过大或者过小

热门文章

  1. Mal-PEG6-PFP,1599486-33-5化学式:C25H30F5NO10小分子PEG
  2. oracle sql执行历史,Oracle 历史SQL执行耗时查询
  3. 三星i9502 获取ROOT超级管理员权限
  4. Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用
  5. Yolov5移植树莓派实现目标检测
  6. 红米android os耗电,体验真正流畅带来的快感,120Hz高刷新率的红米/Redmi K30测评报告...
  7. 华为vivo小米魅族oppo荣耀安卓手机刷IOS苹果系统
  8. 线程概念和多线程模型【操作系统学习笔记】
  9. git禁止上传不想上传的文件
  10. java如何将两首歌按时间合成_怎么制作串烧歌曲?将多首音乐合并成一首音乐的操作方法...