博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用FrameLayout来适配ImageViw按比例展示
阅读量:2359 次
发布时间:2019-05-10

本文共 2340 字,大约阅读时间需要 7 分钟。

一、布局文件:

再创建attrs.xml文件:

/** * 自定义控件,按比例来决定布局高度 做了让View支持wrap_content与padding * Created by 15827 on 2017/5/22. */public class RatioLayout extends FrameLayout {    private float mRatio;    public RatioLayout(Context context) {        super(context);    }    public RatioLayout( Context context,  AttributeSet attrs) {        super(context, attrs);        //获取属性值        //当自定义属性时,系统会自动生成属性相关id,此id通过R.styleable来引用        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);        // id = 属性名_具体属性字段名称        //系统自动生成RatioLayout_ratio,根据两个name值        mRatio = typedArray.getFloat(R.styleable.RatioLayout_ratio, -1);//宽高比例值        typedArray.recycle();//回收,提高具体性能        //LogUtils.i("ratio=" + mRatio); //布局中的app:ratio=“2.43” 来自这里 也可以利用图片的真实宽高    }    public RatioLayout( Context context,  AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        // 1 获取宽度        // 2 根据宽度和比例ratio,计算控件的高度        // 3 重新测量控件        LogUtils.d("widthMeasureSpec: "+widthMeasureSpec);        // MeasureSpec.AT_MOST; 至多模式, 控件有多大显示多大, wrap_content        // MeasureSpec.EXACTLY; 确定模式, 类似宽高写死成dip, match_parent        // MeasureSpec.UNSPECIFIED; 未指定模式.                int widthMode = MeasureSpec.getMode(widthMeasureSpec);//获取宽度模式        int width = MeasureSpec.getSize(widthMeasureSpec); // 获取宽度值        int heightMode = MeasureSpec.getMode(heightMeasureSpec);//获取高度模式        int height = MeasureSpec.getSize(heightMeasureSpec); // 获取高度值        //宽度确定,高度不确定,mRatio合法,才计算高度值        if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY && mRatio > 0) {            //图片宽度 = 控件宽度 - 左侧内边距 - 右侧内边距            int imageWidth = width - getPaddingLeft() - getPaddingRight();            //图片高度 = 图片宽度 / 宽高比例            int imageHeight = (int) (imageWidth / mRatio + 0.5f);            // 控件高度 = 图片高度 + 上侧内边距 + 下侧内边距            height = imageHeight + getPaddingTop() + getPaddingBottom();            //根据最新的高度重新生成 heightMeasureSpec (高度模式是确定模式)            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);        }        //按照最新的高度测量控件        super.onMeasure(widthMeasureSpec, heightMeasureSpec);            }}

转载地址:http://egjtb.baihongyu.com/

你可能感兴趣的文章
css之clearfix的用法深入理解(必看篇)
查看>>
命令行执行gulp first,报错:The following tasks did not complete: first
查看>>
webpack编译遇到的问题:Error: Cannot find module ‘webpack-cli/bin/config-yargs‘
查看>>
npm安装依赖时-S和-D的作用及区别
查看>>
‘ssh-keygen‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
查看>>
阿里图标库iconfont下载和在旧有的iconfont中添加新的图标
查看>>
禁用eslint语法报错 --适用于我的vue-cli 4.5.11
查看>>
css3的坐标轴是相对于电脑屏幕还是物体自身?
查看>>
CSS中line-height:150%与line-height:1.5的区别
查看>>
修改cssrem里面html字体的基准大小
查看>>
安装指定版本的nodejs
查看>>
安装scss-loader、node-sass时报错提示 ‘\\node_modules\\node-sass\\vendor\\win32-x64-57\\binding.node
查看>>
运行 react-native run-android 报错
查看>>
详解Vue中的虚拟DOM
查看>>
css选择符的分类:共分8种-----看张鹏老师视频PPT课件所得
查看>>
看书《DIV+CSS商业案例与网页布局开发精讲》_制作站点导航栏_随手笔记
查看>>
子元素margin-top,为什么对父元素也起作用?
查看>>
纠结了一晚上的问题---点击导航栏的一个文本链接后所有导航栏文本链接颜色都变成访问过的颜色了
查看>>
看书《DIV+CSS商业案例与网页布局开发精讲》_制作列表和表单1_随手笔记
查看>>
直接写position:absolute,后面不加top和left等值,是什么意思?分两种情况
查看>>