# RatioLayout
**Repository Path**: modificator/RatioLayout
## Basic Information
- **Project Name**: RatioLayout
- **Description**: RatioLayout 按比例布局,适配屏幕
- **Primary Language**: Android
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 27
- **Forks**: 6
- **Created**: 2015-10-05
- **Last Updated**: 2023-02-15
## Categories & Tags
**Categories**: android-modules
**Tags**: None
## README
# RatioLayout
RatioLayout 按比例布局,适配屏幕
#####还在为UI只标注IOS 的尺寸而犯愁?
#####讲道理? 和女孩子讲道理,你疯了? 男的?要不你试试打一顿
#####靠眼力?别开玩笑了,你那电脑屏幕,眼睛会瞎的
#####还在为不同的屏幕 写几套尺寸? 省省吧,哪有那么浪费时间的
上图


因为经常用到Relative,所以先重写 RelativeLayout
后来因为Material Design的水波效果又加上了FrameLayout
使用方法:
```xml
```
首先呢,你需要,自己确定高或者宽的具体尺寸(- - 在努力)
然后呢app:reference 这个填入之前确定尺寸的是高还是宽
app:ratioHeight
app:ratioWidth
这两个呢,就是宽高比了,直接填入IOS的尺寸也是可以的呀:)
要有别的?
构造方法填入
```java
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioRelativeLayout, defStyleAttr, 0);
//获取参考边
reference = typedArray.getInt(R.styleable.RatioRelativeLayout_reference, 0) == 0 ? ReferenceType.WIDTH : ReferenceType.HEIGHT;
//获取高比例
ratioHeight = typedArray.getFloat(R.styleable.RatioRelativeLayout_ratioHeight, 1);
//获取宽比例
ratioWidth = typedArray.getFloat(R.styleable.RatioRelativeLayout_ratioWidth, 1);
typedArray.recycle();
```
外面填入
```java
/**
* 以哪边为参考,默认为宽
*/
ReferenceType reference = ReferenceType.WIDTH;
/**
* 宽的比例
*/
double ratioWidth = 1;
/**
* 高的比例
*/
double ratioHeight = 1;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 如果以宽慰基准边则宽不变,高按比例得出具体数值,反之亦然
*/
setMeasuredDimension(View.getDefaultSize(0, reference == ReferenceType.WIDTH ? widthMeasureSpec :
(int) (heightMeasureSpec / ratioHeight * ratioWidth)),
View.getDefaultSize(0, reference == ReferenceType.HEIGHT ? heightMeasureSpec :
(int) (widthMeasureSpec / ratioWidth * ratioHeight)));
int childSpec = reference == ReferenceType.WIDTH ? getMeasuredWidth() : getMeasuredHeight();
/**
* 获取非基准边的尺寸
*/
int measureSpec = reference == ReferenceType.HEIGHT ? MeasureSpec.makeMeasureSpec(
(int) (childSpec / ratioHeight * ratioWidth), MeasureSpec.EXACTLY) :
MeasureSpec.makeMeasureSpec(
(int) (childSpec / ratioWidth * ratioHeight), MeasureSpec.EXACTLY);
super.onMeasure(reference == ReferenceType.WIDTH ? widthMeasureSpec : measureSpec, reference == ReferenceType.HEIGHT ? heightMeasureSpec : measureSpec);
}
```
就可以了,适用View&ViewGroup