一般而言,做图片的适配都是根据图片的尺寸计算图片的宽高比根据宽高比再做图片在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); } } }
新闻热点
疑难解答