迈出第一步:自适应高度的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相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...
随机推荐
- div中iframe高度自适应问题
网页分为上.中.下三部分,上.下高度固定中间高度自适应:中间分为左.右两部分,左边宽度固定,右边宽度自适应.现在右侧div是宽度和高度都是自适应,右侧div里有个IFrame,想让IFrame自适应外 ...
- C语言pow函数编写
C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...
- Quartus II USB-Blaster驱动解决
Quartus II USB-Blaster驱动解决 之前安装Quartus II 13.0,但FPGA开发板链接的USB-Blaster链接无法被Quartus识别,改装Quartus II 11. ...
- Apache+Tomcat实现负载均衡
反向代理负载均衡 (Apache2+Tomcat7/8) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方 ...
- C# MVC jsonp初接触成功
利用jsonp进行跨域请求资源 C# MVC ApiControllers准备如下: 1.需要在引用处右键管理NuGet安装jsonp插件 2.在Application_Start()中配置 Glob ...
- 4. 什么是AJAX
术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验.在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步.Ajax提供与服务器 ...
- github 删除仓库 repository
1.点开想要删除的仓库 2点击setting 3.拉到最下面 4.点击 Delete this repository 5.输入想删除仓库的名字 点击
- C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编
验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...
- Apache部署django项目
在此之前,我们一直使用django的manage.py 的runserver 命令来运行django应用,但这只是我们的开发环境,当项目真正部署上线的时候这做就不可行了,必须将我们的项目部署到特定的w ...
- Hdu 4681 2013 Multi-University Training Contest 8 String
带跨越式的LCS,同样是在朴素的LCS上加入一种跨越一段的转移,这样我们要预处理出跨越一段给定串的转移函数. 这个题同样可以正反两边LCS做 呆马: #include <iostream> ...