zoukankan      html  css  js  c++  java
  • 关于屏幕适配之比例布局

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

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

  • 相关阅读:
    UV动画
    使用RampTexture实现BRDF效果
    使用RampTexture来控制diffuse shading
    Half Lambert
    Lamber算法 & SurfaceShader自定义光照
    What is _MainTex_ST ?
    C# Enum,Int,String的互相转换
    Plugins in Unity
    Mono在Full AOT模式下的限制
    雾化
  • 原文地址:https://www.cnblogs.com/BlogCommunicator/p/8968836.html
Copyright © 2011-2022 走看看