对于平板等需求场合,它们的屏幕比例以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运算)
综合以上两类方法,可以解决比例布局的大部分需求