自定義寬高比例的view(輪播圖,item等)
阿新 • • 發佈:2019-02-16
為解決輪播圖、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=" "
在values下的 attrs下<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>
<declare-styleablename="RatioLayout">
<attrname="ratio"format="float"/>
</declare-styleable>
Android學習手冊APP,手機上隨時學習包括(android基礎,android元件,使用者介面,裝置功能,資料儲存,網路應用,遊戲開發,多媒體,原始碼開發,高階,android面試題)
http://download.csdn.net/detail/mengshirui_/9576713