需求:今天在做ListView的時候遇到一個問題,就是ListView中加載圖檔的時候。有些圖檔的大小比較大,是以會出現圖檔顯示不充分的問題。
首先,再不做任何處理的情況下,大小是這樣的。寬度是WrapContent。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxITMwATN0ADOtkDM0cTNyUjMyQjMxEjNxAjMtczNyEzN48CXxEjNxAjMvw1N3ITM3gzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
那麼怎麼解決呢??
1、首先FIX_XY,但是這樣會引起失真。
2、于是需要換個解決方案,那就是自定義View,重寫onMeasure方法。
自定義一個屬性:長寬高比。通過自己重寫onMeasure方法來解決。
具體解決代碼如下:
package com.itheima.googleplay_8.views;
import com.itheima.googleplay_8.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.FrameLayout;
/**
* @author Administrator
* @time 2015-7-18 下午2:10:54
* @des TODO
*
* @version $Rev: 33 $
* @updateAuthor $Author: admin $
* @updateDate $Date: 2015-07-18 15:13:26 +0800 (星期六, 18 七月 2015) $
* @updateDes TODO
*/
public class RatioLayout extends FrameLayout {
private float mPicRatio = 0f; // 圖檔的寬高比 2.43
private static final int RELATIVE_WIDTH = 0; // 控件寬度固定,已知圖檔的寬高比,求控件的高度
private static final int RELATIVE_HEIGHT = 1; // 控件高度固定,已知圖檔的寬高比,求控件的寬度
private int mRelative = RELATIVE_WIDTH;
public RatioLayout(Context context) {
this(context, null);
}
public RatioLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
mPicRatio = typedArray.getFloat(R.styleable.RatioLayout_picRatio, 0);
mRelative = typedArray.getInt(R.styleable.RatioLayout_relative, RELATIVE_WIDTH);
typedArray.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 控件寬度固定,已知圖檔的寬高比,求控件的高度
int parentWidthMode = MeasureSpec.getMode(widthMeasureSpec);
// 控件高度固定,已知圖檔的寬高比,求控件的寬度
int parentHeightMode = MeasureSpec.getMode(heightMeasureSpec);
if (parentWidthMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_WIDTH) {// 控件寬度固定,已知圖檔的寬高比,求控件的高度
// 得到父容器的寬度
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
// 得到孩子的寬度
int childWidth = parentWidth - getPaddingLeft() - getPaddingRight();
// 控件的寬度/控件的高度 = mPicRatio;
// 計算孩子的高度
int childHeight = (int) (childWidth / mPicRatio + .5f);
// 計算父容器的高度
int parentHeight = childHeight + getPaddingBottom() + getPaddingTop();
// 主動測繪孩子.固定孩子的大小
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
// 設定自己的測試結果
setMeasuredDimension(parentWidth, parentHeight);
} else if (parentHeightMode == MeasureSpec.EXACTLY && mPicRatio != 0 && mRelative == RELATIVE_HEIGHT) {
// 控件高度固定,已知圖檔的寬高比,求控件的寬度
// 得到父親的高度
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
// 得到孩子的高度
int childHeight = parentHeight - getPaddingBottom() - getPaddingTop();
// 控件的寬度/控件的高度 = mPicRatio;
// 計算控件寬度
int childWidth = (int) (childHeight * mPicRatio + .5f);
// 得到父親的寬度
int parentWidth = childWidth + getPaddingRight() + getPaddingLeft();
// 主動測繪孩子.固定孩子的大小
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
// 設定自己的測試結果
setMeasuredDimension(parentWidth, parentHeight);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
轉載于:https://www.cnblogs.com/tinyclear/p/6099881.html