迈出第一步:自适应高度的ImageView(AutoHeightImageView)
这个博客注册很久了,可是一直都没有勇气来写一点东西。今天解决了一个让我纠结很久的问题,于是,我决定开始我的博客生涯,希望我能坚持下去。
不知道是不是只有我遇到了这个问题,在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)的更多相关文章
- 迈出第一步,Hexo博客搭建
很早之前看到别人的博客就总想着自己之后也要搭一个,最近突然来了干劲,就开始搭起了博客.不过搭博客还真是一个累活,失败了不下十次,用了好几天的时间,感觉自己在浪费时间,但是看到现在博客终于能用了,非常开 ...
- 【转】APUE学习1:迈出第一步,编译myls.c
原文网址:http://blog.csdn.net/sddzycnqjn/article/details/7252444 注:以下写作风格均学习自潘云登前辈 /******************** ...
- 【python开发】迈出第一步,这可能是我唯一一次的Python开发了
好久没写博了,今天就瞎唠唠吧 背景: 组内有个测试平台,是基于Python2+tornado 框架写的,之前自己维护了一套系统的UIweb自动化代码,现在需要集成进去.这很可能是自己唯一一次基于pyt ...
- 创业小记:ALL IN才是迈出创业第一步的关键
对于创业而言,能卖出这创业第一步的,大多都经过了长期反复的心理拷问与折磨. 因为当你迈出创业的那一步,你可能需要面对的是毫无收入保障的生活,以及后果自负的结局. ALL IN才是迈出创业第一步的关键( ...
- cell自适应高度
MyModel.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MyModel : ...
- Cell自适应高度及自定义cell混合使…
第一部分:UItableViewCellAdaptionForHeight : cell的自适应高度 第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例) = ...
- iframe之间通信问题及iframe自适应高度问题
下面本人来谈谈iframe之间通信问题及iframe自适应高度问题. 1. iframe通信 分为:同域通信 和 跨域通信.所谓同域通信是指 http://localhost/demo/iframe/ ...
- 高德携手阿里云发布“LBS云”,账户打通只是第一步
位置.游戏.视频,是公认的基于云计算的三大移动端应用方向.而今,LBS云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...
- 仿造slither.io第一步:先画条蛇
前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...
随机推荐
- 微信支付开发(7) 收货地址共享接口V2
关键字:微信公众平台 JSSDK 发送给朋友 收货地址共享接口 openAddress 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-open ...
- python图片添加水印(转载)
转载来自:http://blog.csdn.net/orangleliu/ # -*- encoding=utf-8 -*- ''''' author: orangleliu pil处理图片,验证,处 ...
- ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错
今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...
- 使用linq的好处
1.linq非常方便,把复杂的业务逻辑从数据库分离,起到了很好的优化作用 2.linq非常灵活,可以用基本统一的访问方式,访问各种数据源,对项目的管理和维护,起到了十分便捷的作用 3.用linq可以不 ...
- Wampserver 2.5 多站点配置方法
写在开头:本文适用于wampserver2.5版本,和wamp的老版本配置有语法上的区别,笔者正是因为被老版本的配置办法给整迷糊了所以才总结了一篇针对2.5版本的配置方法,如果您还停留在1.x或着已经 ...
- 使用Microsoft Fakes隔离测试代码
在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...
- git tag — 标签相关操作
标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ Git tag # 在控制台打印出当前仓库的所有标签$ git tag -l 'v0.1.*' # 搜索符合模式的标签 打标签 gi ...
- App.domain http->https
App.domain = `${location.origin}/toa-mgw/rest/gateway`.replace(/http:\/\//, 'https://');
- Hibernate不能自动建表解决办法
最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...
- 【git常见问题】fatal: Not a valid object name: 'master'.
创建本地分支:git branch dev 报错:fatal: Not a valid object name: 'master'. 原因: 问题描述-一个非法的master,原因:本地还没有创建ma ...