Android手机图片适配问题
需求:今天在做ListView的时候遇到一个问题,就是ListView中加载图片的时候。有些图片的大小比较大,所以会出现图片显示不充分的问题。
首先,再不做任何处理的情况下,大小是这样的。宽度是WrapContent。
那么怎么解决呢??
1、首先FIX_XY,但是这样会引起失真。
2、于是需要换个解决方案,那就是自定义View,重写onMeasure方法。
自定义一个属性:长宽高比。通过自己重写onMeasure方法来解决。
具体解决代码如下:
- package com.itheima.googleplay_8.views;
- import com.itheima.googleplay_8.R;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.util.AttributeSet;
- import android.widget.FrameLayout;
- /**
- * @author Administrator
- * @time 2015-7-18 下午2:10:54
- * @des TODO
- *
- * @version $Rev: 33 $
- * @updateAuthor $Author: admin $
- * @updateDate $Date: 2015-07-18 15:13:26 +0800 (星期六, 18 七月 2015) $
- * @updateDes TODO
- */
- public class RatioLayout extends FrameLayout {
- private float mPicRatio = 0f; // 图片的宽高比 2.43
- private static final int RELATIVE_WIDTH = 0; // 控件宽度固定,已知图片的宽高比,求控件的高度
- private static final int RELATIVE_HEIGHT = 1; // 控件高度固定,已知图片的宽高比,求控件的宽度
- private int mRelative = RELATIVE_WIDTH;
- public RatioLayout(Context context) {
- this(context, null);
- }
- public RatioLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
- mPicRatio = typedArray.getFloat(R.styleable.RatioLayout_picRatio, 0);
- mRelative = typedArray.getInt(R.styleable.RatioLayout_relative, RELATIVE_WIDTH);
- typedArray.recycle();
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // 控件宽度固定,已知图片的宽高比,求控件的高度
- int parentWidthMode = MeasureSpec.getMode(widthMeasureSpec);
- // 控件高度固定,已知图片的宽高比,求控件的宽度
- int parentHeightMode = MeasureSpec.getMode(heightMeasureSpec);
- if (parentWidthMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_WIDTH) {// 控件宽度固定,已知图片的宽高比,求控件的高度
- // 得到父容器的宽度
- int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
- // 得到孩子的宽度
- int childWidth = parentWidth - getPaddingLeft() - getPaddingRight();
- // 控件的宽度/控件的高度 = mPicRatio;
- // 计算孩子的高度
- int childHeight = (int) (childWidth / mPicRatio + .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 if (parentHeightMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_HEIGHT) {
- // 控件高度固定,已知图片的宽高比,求控件的宽度
- // 得到父亲的高度
- int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
- // 得到孩子的高度
- int childHeight = parentHeight - getPaddingBottom() - getPaddingTop();
- // 控件的宽度/控件的高度 = mPicRatio;
- // 计算控件宽度
- int childWidth = (int) (childHeight * mPicRatio + .5f);
- // 得到父亲的宽度
- int parentWidth = childWidth + getPaddingRight() + getPaddingLeft();
- // 主动测绘孩子.固定孩子的大小
- 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);
- }
- }
- }
Android手机图片适配问题的更多相关文章
- 老李分享:android手机测试之适配(1)
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- Android开发——Android手机屏幕适配方案总结
)密度无关像素,单位为dp,是Android特有的单位 Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果. /** * dp与px的转 ...
- 老李分享:android手机测试之适配(2)
但 Android 版本低于 3.2 的设备不支持此技术,原因是这些设备无法将 sw600dp 识别为尺寸限定符,因此我们仍需使用 large 限定符.这样一来,就会有一个名称为 res/layout ...
- android 手机 多分辨率适配
近来在做android屏幕适配这方面的工作, 今天总算有点眉目. 小记一下 基础知识就不科普了, 网上一大堆. 作为一个刚接触这方面人, 最先进入我脑子的, 是从小到大的各种屏, 小到手表, 大到街 ...
- Android手机图片路径
H:\dcim\100MEDIA H:\Tencent\MobileQQ\photo H:\Tencent\MobileQQ\photo H:\Tencent\MobileQQ\thumb H:\Te ...
- Android 关于屏幕适配
android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 转自:http://www.c ...
- 【Android】Android中不同手机分辨率适配问题
在项目开发的过程中,同一个布局对应不同的手机会显示出不同的效果.导致这个现象产生的原因是不同手机的分辨率不同.在android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小.QV ...
- Android中的适配方式
1,图片适配(在不同像素密度的手机上,加载不同文件夹下的图片) 一套图(800*480,将截取的图片放置在hdpi下,小图(变形不明显), 大图(根据适配的手机,做单独的截取,比如有两款手机适配(做两 ...
- android手机和ios手机的分辨率
Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3 VGA 640*480 (Video Graphics Array) QVGA 320*240 (Quarter VGA ...
随机推荐
- 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 ...
- Chapter 14_5 _ENV和load
load在加载代码块时,通常使用全局环境去初始化代码块的_ENV上值. 然而,load选项的第四个参数给出的值就是供_ENV用的.(loadfile函数参数也是一样) 举一个有关初始化的例子,假如我们 ...
- 洛谷-火柴棒等式-NOIP2008提高组复赛
题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...
- Tcp Socket非阻塞recv
最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...
- CCNET+MSBuild+SVN实时构建的优化总结
本文不是介绍如何使用CCNET+MSBuild+SVN构建自动编译系统,相关的内容可以从很多地方获取,可以再园子里搜一下. 随着我们的SVN库日益壮大,容量达到10G,几十G 甚至更大时,我们发现自动 ...
- 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 ...
- python 字典排序,列表排序详细
在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...
- VBS中解决路径带空格的三种方法
vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...
- linux下shell命令trap
某些时候,在执行shell脚本(.sh)时,我们并不希望被打断.这时我们要用到trap命令. 例如: 在shell脚本中,忽略“终止”信号 trap ' ' TERM
- CentOS + EPEL YUM源地址
[bizosv] name=bizsov-centos-$releasever - centos baseurl=http://yikat:yikat@download.bizsov.com/ gpg ...