一般而言,做图片的适配都是根据图片的尺寸计算图片的宽高比
根据宽高比再做图片在Activity中的显示适配,这里就做个笔记吧方便以后查看
public class RatioLayout extends FrameLayout{
// 图片宽高比 scale = width/height 这个根据图片的实际比例求出
private float mPicScale = 2.43f;
public RatioLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RatioLayout(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if ( widthMode == MeasureSpec.EXACTLY) {// 已知宽度的模式下
// 已知宽度,即在布局文件中的width=match_parent
// 获取自身的宽高
int height = MeasureSpec.getSize(heightMeasureSpec);
// 根据公式和已知的宽度获取高度
int width = (int) (height * mPicScale+0.5f);
// 保存测绘结果
setMeasuredDimension(width, height);
// 获取子组件的宽高
int childWidth = width - getPaddingLeft() - getPaddingRight();
int childHeight = height - getPaddingBottom() - getPaddingTop();
// 测量子组件
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY);
measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
} else if(heightMode == MeasureSpec.EXACTLY){
// 已知宽度,即在布局文件中的width=match_parent
// 获取自身的宽高
int width = MeasureSpec.getSize(widthMeasureSpec);
// 根据公式和已知的宽度获取宽度
int height = (int) (width/mPicScale+0.5f);
// 保存测绘结果
setMeasuredDimension(width, height);
// 获取子组件的宽高
int childWidth = width - getPaddingLeft() - getPaddingRight();
int childHeight = height - getPaddingBottom() - getPaddingTop();
// 测量子组件
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY);
measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}