关于屏幕适配之比例布局

对于平板等需求场合,它们的屏幕比例以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运算)

 

综合以上两类方法,可以解决比例布局的大部分需求

 

posted @ 2018-04-28 17:13  BlogCommunicator  阅读(622)  评论(0编辑  收藏  举报