对于平板等需求场合,它们的屏幕比例以16:10和16:9等为主,
但是屏幕尺寸各异,分辨率各异,即便是同一尺寸也有多种分辨率,
这种时候无论是使用dp还是px,相对布局还是线性布局,都达不到效果。
但是比例布局在这种情况下能较好地适配。
首先看一下使用自定义控件实现比例布局:
谷歌已经实现了比例布局中的PercentRelativeLayout和PercentFrameLayout,
其余的要自己实现,例如PercentTextView等
谷歌实现的类的代码在SDK路径下就有PercentRelativeLayout.java,PercentFrameLayout.java,PercentLayoutHelper.java以及attrs.xml
先来看一下attrs.xml中的属性
<declare-styleable name="PercentLayout_Layout"> <attr name="layout_widthPercent" format="fraction"/> <attr name="layout_heightPercent" format="fraction"/> <attr name="layout_marginPercent" format="fraction"/> <attr name="layout_marginLeftPercent" format="fraction"/> <attr name="layout_marginTopPercent" format="fraction"/> <attr name="layout_marginRightPercent" format="fraction"/> <attr name="layout_marginBottomPercent" format="fraction"/> <attr name="layout_marginStartPercent" format="fraction"/> <attr name="layout_marginEndPercent" format="fraction"/> <attr name="layout_aspectRatio" format="fraction" /> </declare-styleable>
例如父wiew使用PercentRelativeLayout
子view就可以使用这些属性了,而且自定义view可以嵌套,例如
<android.support.percent.PercentRelativeLayout android:id="@+id/titlebar" android:layout_width="0dp" android:layout_height="0dp" app:layout_heightPercent="6.75%" app:layout_widthPercent="100%" android:background="@drawable/titlebar" > <android.support.percent.PercentTextView android:id="@+id/texttitle" android:layout_width="0dp" android:layout_height="0dp" app:layout_heightPercent="77.7777778%" app:layout_marginLeftPercent="0.39%" app:layout_marginTopPercent="10%" app:layout_widthPercent="15.390625%" android:background="@drawable/titletextbk" android:gravity="center" android:textColor="@android:color/white" android:textSize="26px" /> <ImageView android:id="@+id/listmode" android:layout_width="0dp" android:layout_height="0dp" app:layout_heightPercent="81.4814815%" app:layout_marginLeftPercent="19.14%" app:layout_marginTopPercent="10%" app:layout_widthPercent="5.15625%" android:background="@drawable/listpage" android:clickable="true" android:focusable="true" android:onClick="listmodeOnClick" /> ......
其中layout_aspectRatio这个属性并不能让布局保持原始比例缩放,而是强制保持某个指定的比例
当需要比例的textview的时候,就需要自定义了
继承TextView,主要是重写了setTextSize()方法,并在构造方法中调用了它
以上是针对布局的比例布局
在使用针对布局的比例布局时候遇到过ScrollView下不能放比例布局的问题,只好撤去ScrollView
接下来说一下代码中的比例布局:
思路在于得到屏幕分辨率与标准(例如1280)的比例
public class Util { String TAG = "Util"; private static float ratio = 1f; private static int getWidthPix(Activity activity) { DisplayMetrics displayMetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay() .getMetrics(displayMetrics); int widthPixels = displayMetrics.widthPixels; return widthPixels; } /** * 得到分辨率比例,要在initRatio执行之后执行 * @param context * @return */ public static float getRatio(){ return ratio; } public static void initRatio(Activity activity) { float nowWidthPix = getWidthPix(activity); Log.e("aaa","nowWidthPix:"+ nowWidthPix); ratio = nowWidthPix/1280; }
因为必须传入activity,所以initRatio在MainActivity的OnCreate方法中,一开始就执行,(至于其它得到屏幕分辨率的方法中使用application的context行不行还没试过)
然后在需要得到比例的地方使用getRatio即可
接下来在代码中控制控件的大小和位置,使用px,并乘以或者除以ratio即可达到比例布局的效果(注:有的图片特殊需要作ratio^2运算)
综合以上两类方法,可以解决比例布局的大部分需求