这个博客注册很久了,可是一直都没有勇气来写一点东西。今天解决了一个让我纠结很久的问题,于是,我决定开始我的博客生涯,希望我能坚持下去。

不知道是不是只有我遇到了这个问题,在ListView中显示图片,当需求是显示的图片宽度最宽,但是高度自适应时。在xml里设ImageView的高度属性是不能解决问题的。网上我也找了下方法。有说设 Android:adjustViewBounds这个属性的,它需要设maxheight和maxwidth配合使用,我开始加入的时候,在一些手机上也确实是成功,可是换了个手机之后,发现在不行。也就是说,在android版本这么多,厂商这么多的情况下。它不能保证效果是可以实现。然后也有方法说在设完图片图片之后,去根据图片的宽高比,设控件的高度,我没有去做代码的实现,因为我知道它可行,但是不是我想的要。

直接先上代码吧:

 import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RelativeLayout; public class AutoHeightImageView extends ImageView { private Drawable mDrawable = null;
private static int mWidth = 0; public AutoHeightImageView(Context context, AttributeSet attrs) {
super(context, attrs);
} public AutoHeightImageView(Context context) {
super(context);
} public AutoHeightImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} @Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mDrawable = getDrawable();
if (mWidth != 0) {
setAutoHeight();
}
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mWidth == 0) {
mWidth = getMeasuredWidth();
if (mDrawable != null) {
setAutoHeight();
}
}
} private void setAutoHeight() {
float scale = mDrawable.getMinimumHeight() / (float) mDrawable.getMinimumWidth();
float height = mWidth * scale;
setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, (int) height));
}
}

看完其实是很简单的东西,实现也就是根据图片的宽高比来完成,只是我把这些让到的控件的自定义里实现。说说需要注意的问题吧:在重写的OnMeasure()方法里,要在调用了super的方法之后,再能得到你在xml里ImageView的宽度,因为我这里高度由宽度决定,所以只能取最初那一次的,OnMeasure()方法会多次调用(没有去追究原因),这样,放到ListView里的时间,高度就能自适应了。

弄出来,自己是挺开心的,希望大家有意见和建议多多指出。也希望我能有更的东西分享出来,让大家帮忙优化,一起提高!

续:自己在复用这个控件的时候,发现在个问题,也又弄清楚了一个问题:

关于这名话的

setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, (int) height));

当我要这个控件用到一个LinearLayout下的时候,异常了,原来这个LayoutParams和它所在父控件有关。不分统一用一个,后改成了

if (getParent() instanceof RelativeLayout) {
  setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, (int) height));
}
if (getParent() instanceof LinearLayout) {
  setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) height));
}

自己根据需要加吧!

迈出第一步:自适应高度的ImageView(AutoHeightImageView)的更多相关文章

  1. 迈出第一步,Hexo博客搭建

    很早之前看到别人的博客就总想着自己之后也要搭一个,最近突然来了干劲,就开始搭起了博客.不过搭博客还真是一个累活,失败了不下十次,用了好几天的时间,感觉自己在浪费时间,但是看到现在博客终于能用了,非常开 ...

  2. 【转】APUE学习1:迈出第一步,编译myls.c

    原文网址:http://blog.csdn.net/sddzycnqjn/article/details/7252444 注:以下写作风格均学习自潘云登前辈 /******************** ...

  3. 【python开发】迈出第一步,这可能是我唯一一次的Python开发了

    好久没写博了,今天就瞎唠唠吧 背景: 组内有个测试平台,是基于Python2+tornado 框架写的,之前自己维护了一套系统的UIweb自动化代码,现在需要集成进去.这很可能是自己唯一一次基于pyt ...

  4. 创业小记:ALL IN才是迈出创业第一步的关键

    对于创业而言,能卖出这创业第一步的,大多都经过了长期反复的心理拷问与折磨. 因为当你迈出创业的那一步,你可能需要面对的是毫无收入保障的生活,以及后果自负的结局. ALL IN才是迈出创业第一步的关键( ...

  5. cell自适应高度

    MyModel.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MyModel : ...

  6. Cell自适应高度及自定义cell混合使…

    第一部分:UItableViewCellAdaptionForHeight : cell的自适应高度 第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例) = ...

  7. iframe之间通信问题及iframe自适应高度问题

    下面本人来谈谈iframe之间通信问题及iframe自适应高度问题. 1. iframe通信 分为:同域通信 和 跨域通信.所谓同域通信是指 http://localhost/demo/iframe/ ...

  8. 高德携手阿里云发布“LBS云”,账户打通只是第一步

    位置.游戏.视频,是公认的基于云计算的三大移动端应用方向.而今,LBS云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...

  9. 仿造slither.io第一步:先画条蛇

    前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...

随机推荐

  1. Webstorm功能详解及插件推荐

    Web前端开发神器--Webstorm不用多介绍,强大的智能提示只是它的一个功能特性,它还具有许多有用的特性,比如版本控制.本地历史.即时模板等.Webstorm还内置了对 SASS.NodeJS.C ...

  2. DS-5建工程

    DS-5教程-使用ARM DS-5 和DSTREAM仿真器调试裸机程序 http://bbs.elecfans.com/jishu_453909_1_1.html i2c( 楼主 )2014-10-1 ...

  3. leetcode 155

    题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant ti ...

  4. querystring 解析url 查询字符串

    对前端同学来说,经常要碰到一种比较麻烦的情况,那就是url查询字符串的解析问题.说起来也不难,就是比较麻烦. 具体来处理这种情况的时候,相信有一部分同学就是针对具体项目中的需要的字符去正则匹配一下,业 ...

  5. poj 3254 Corn Fields

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  6. Js动态获取iframe子页面的高度////////////////////////zzzz

    Js动态获取iframe子页面的高度   Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...

  7. web 安全的前期准备哦

    学习web安全  需要的软件  和 基础 基础会在以后发出来  软件  在网上都可以下 首先   你要有一款虚拟机软件 虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样 ...

  8. mysql时间格式化,按时间段查询的MySQL语句

    描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...

  9. 优化 bulk insert

    https://www.simple-talk.com/sql/learn-sql-server/bulk-inserts-via-tsql-in-sql-server/

  10. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...