需求:今天在做ListView的时候遇到一个问题,就是ListView中加载图片的时候。有些图片的大小比较大,所以会出现图片显示不充分的问题。

首先,再不做任何处理的情况下,大小是这样的。宽度是WrapContent。

那么怎么解决呢??

1、首先FIX_XY,但是这样会引起失真。

2、于是需要换个解决方案,那就是自定义View,重写onMeasure方法。

自定义一个属性:长宽高比。通过自己重写onMeasure方法来解决。

具体解决代码如下:

  1. package com.itheima.googleplay_8.views;
  2.  
  3. import com.itheima.googleplay_8.R;
  4.  
  5. import android.content.Context;
  6. import android.content.res.TypedArray;
  7. import android.util.AttributeSet;
  8. import android.widget.FrameLayout;
  9.  
  10. /**
  11. * @author Administrator
  12. * @time 2015-7-18 下午2:10:54
  13. * @des TODO
  14. *
  15. * @version $Rev: 33 $
  16. * @updateAuthor $Author: admin $
  17. * @updateDate $Date: 2015-07-18 15:13:26 +0800 (星期六, 18 七月 2015) $
  18. * @updateDes TODO
  19. */
  20. public class RatioLayout extends FrameLayout {
  21. private float mPicRatio = 0f; // 图片的宽高比 2.43
  22. private static final int RELATIVE_WIDTH = 0; // 控件宽度固定,已知图片的宽高比,求控件的高度
  23. private static final int RELATIVE_HEIGHT = 1; // 控件高度固定,已知图片的宽高比,求控件的宽度
  24. private int mRelative = RELATIVE_WIDTH;
  25.  
  26. public RatioLayout(Context context) {
  27. this(context, null);
  28. }
  29.  
  30. public RatioLayout(Context context, AttributeSet attrs) {
  31. super(context, attrs);
  32.  
  33. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
  34.  
  35. mPicRatio = typedArray.getFloat(R.styleable.RatioLayout_picRatio, 0);
  36.  
  37. mRelative = typedArray.getInt(R.styleable.RatioLayout_relative, RELATIVE_WIDTH);
  38.  
  39. typedArray.recycle();
  40. }
  41.  
  42. @Override
  43. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  44.  
  45. // 控件宽度固定,已知图片的宽高比,求控件的高度
  46. int parentWidthMode = MeasureSpec.getMode(widthMeasureSpec);
  47.  
  48. // 控件高度固定,已知图片的宽高比,求控件的宽度
  49. int parentHeightMode = MeasureSpec.getMode(heightMeasureSpec);
  50.  
  51. if (parentWidthMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_WIDTH) {// 控件宽度固定,已知图片的宽高比,求控件的高度
  52. // 得到父容器的宽度
  53. int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  54. // 得到孩子的宽度
  55. int childWidth = parentWidth - getPaddingLeft() - getPaddingRight();
  56. // 控件的宽度/控件的高度 = mPicRatio;
  57.  
  58. // 计算孩子的高度
  59. int childHeight = (int) (childWidth / mPicRatio + .5f);
  60.  
  61. // 计算父容器的高度
  62. int parentHeight = childHeight + getPaddingBottom() + getPaddingTop();
  63.  
  64. // 主动测绘孩子.固定孩子的大小
  65. int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
  66. int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
  67. measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
  68.  
  69. // 设置自己的测试结果
  70. setMeasuredDimension(parentWidth, parentHeight);
  71.  
  72. } else if (parentHeightMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_HEIGHT) {
  73. // 控件高度固定,已知图片的宽高比,求控件的宽度
  74. // 得到父亲的高度
  75. int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  76.  
  77. // 得到孩子的高度
  78. int childHeight = parentHeight - getPaddingBottom() - getPaddingTop();
  79.  
  80. // 控件的宽度/控件的高度 = mPicRatio;
  81. // 计算控件宽度
  82. int childWidth = (int) (childHeight * mPicRatio + .5f);
  83.  
  84. // 得到父亲的宽度
  85. int parentWidth = childWidth + getPaddingRight() + getPaddingLeft();
  86.  
  87. // 主动测绘孩子.固定孩子的大小
  88. int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
  89. int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
  90. measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
  91.  
  92. // 设置自己的测试结果
  93. setMeasuredDimension(parentWidth, parentHeight);
  94.  
  95. } else {
  96. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  97.  
  98. }
  99.  
  100. }
  101. }

Android手机图片适配问题的更多相关文章

  1. 老李分享:android手机测试之适配(1)

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  2. Android开发——Android手机屏幕适配方案总结

    )密度无关像素,单位为dp,是Android特有的单位 Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果. /** * dp与px的转 ...

  3. 老李分享:android手机测试之适配(2)

    但 Android 版本低于 3.2 的设备不支持此技术,原因是这些设备无法将 sw600dp 识别为尺寸限定符,因此我们仍需使用 large 限定符.这样一来,就会有一个名称为 res/layout ...

  4. android 手机 多分辨率适配

    近来在做android屏幕适配这方面的工作, 今天总算有点眉目.  小记一下 基础知识就不科普了, 网上一大堆. 作为一个刚接触这方面人, 最先进入我脑子的, 是从小到大的各种屏, 小到手表, 大到街 ...

  5. Android手机图片路径

    H:\dcim\100MEDIA H:\Tencent\MobileQQ\photo H:\Tencent\MobileQQ\photo H:\Tencent\MobileQQ\thumb H:\Te ...

  6. Android 关于屏幕适配

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 转自:http://www.c ...

  7. 【Android】Android中不同手机分辨率适配问题

    在项目开发的过程中,同一个布局对应不同的手机会显示出不同的效果.导致这个现象产生的原因是不同手机的分辨率不同.在android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小.QV ...

  8. Android中的适配方式

    1,图片适配(在不同像素密度的手机上,加载不同文件夹下的图片) 一套图(800*480,将截取的图片放置在hdpi下,小图(变形不明显), 大图(根据适配的手机,做单独的截取,比如有两款手机适配(做两 ...

  9. android手机和ios手机的分辨率

    Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3 VGA     640*480 (Video Graphics Array) QVGA  320*240 (Quarter VGA ...

随机推荐

  1. Makefile:130: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.

    修改了snmp里面的包Makefile,出现了如下问题: Makefile:130: *** missing separator (did you mean TAB instead of 8 spac ...

  2. Chapter 14_5 _ENV和load

    load在加载代码块时,通常使用全局环境去初始化代码块的_ENV上值. 然而,load选项的第四个参数给出的值就是供_ENV用的.(loadfile函数参数也是一样) 举一个有关初始化的例子,假如我们 ...

  3. 洛谷-火柴棒等式-NOIP2008提高组复赛

    题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...

  4. Tcp Socket非阻塞recv

    最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...

  5. CCNET+MSBuild+SVN实时构建的优化总结

    本文不是介绍如何使用CCNET+MSBuild+SVN构建自动编译系统,相关的内容可以从很多地方获取,可以再园子里搜一下. 随着我们的SVN库日益壮大,容量达到10G,几十G 甚至更大时,我们发现自动 ...

  6. sql语句-排序后加入序号再运算判断取想要的项

    select a.id as aid,b.id as bid,a.city,a.cang,a.sid,a.time as atime,b.time as btime,a.price as aprice ...

  7. python 字典排序,列表排序详细

    在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...

  8. VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  9. linux下shell命令trap

    某些时候,在执行shell脚本(.sh)时,我们并不希望被打断.这时我们要用到trap命令. 例如: 在shell脚本中,忽略“终止”信号 trap  ' '   TERM

  10. CentOS + EPEL YUM源地址

    [bizosv] name=bizsov-centos-$releasever - centos baseurl=http://yikat:yikat@download.bizsov.com/ gpg ...