1. 程式人生 > >自定義寬高比例的view(輪播圖,item等)

自定義寬高比例的view(輪播圖,item等)

為解決輪播圖、listview中的item,放在不通解析度的手機上會出現拉伸變形。

比較簡單  不多說  下邊直接貼程式碼

關於下邊方法中

- getPaddingLeft() - getPaddingRight()後又加上是因為
如果view中設定了padding 則會改變正確的比例值
+ 0.5f
因float型別轉換int型別是為了減少誤差[(49.2+0.5f)=49  (49.7+0.5f)=50]
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.FrameLayout;
/**
 * 作者:Created by mengshirui on 2016-07-18
 * 郵箱:
 * 描述:自定義寬高比例的view
 */
public class RatioLayout extends FrameLayout {
	// 寬和高的比例
	private float ratio = 0.0f;
	public RatioLayout(Context context) {
		this(context, null);
	}
	public RatioLayout(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	public RatioLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		//從xml中獲取比例值(需在values下的attrs下宣告)
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
		ratio = a.getFloat(R.styleable.RatioLayout_ratio, 0.0f);
		a.recycle();
	}
	/**
	 * 可程式碼設定,或者佈局中設定
    <span style="white-space:pre">	</span> * 設定寬高比例
	 * @param f
     */
	public void setRatio(float f) {
		ratio = f;
	}
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int widthMode = MeasureSpec.getMode(widthMeasureSpec);
		int heightMode = MeasureSpec.getMode(heightMeasureSpec);
		int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
		int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
		//MeasureSpec.EXACTLY精確模式
		if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY && ratio != 0.0f) {
			height = (int) (width / ratio + 0.5f);
			heightMeasureSpec = MeasureSpec.makeMeasureSpec(height + getPaddingTop() + getPaddingBottom(),
					MeasureSpec.EXACTLY);
		} else if (widthMode != MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY && ratio != 0.0f) {
			width = (int) (height * ratio + 0.5f);
			widthMeasureSpec = MeasureSpec.makeMeasureSpec(width + getPaddingLeft() + getPaddingRight(),
					MeasureSpec.EXACTLY);
		}else {
			new RuntimeException("設定比例值,寬高需要一個是精確模式");
		}
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
}

在xml中使用的話如下,可直接設定ratia=" "

 <com.ontim.googleplay.view.RatioLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:ratio="2.43"
        >
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitCenter"
            android:src="@mipmap/ic_launcher"/>
    </com.ontim.googleplay.view.RatioLayout>
在values下的  attrs下 <declare-styleablename="RatioLayout"><attrname="ratio"format="float"/></declare-styleable>

Android學習手冊APP,手機上隨時學習包括(android基礎,android元件,使用者介面,裝置功能,資料儲存,網路應用,遊戲開發,多媒體,原始碼開發,高階,android面試題)

http://download.csdn.net/detail/mengshirui_/9576713