android屏幕适配攻略

1.布局适配用sw限定符适配方法

2.全面屏、刘海屏、水滴屏适配

AndroidManifest.xml 中

   application下增加  android:resizeableActivity="false" (意思是不可以分屏显示)与下面搭配必须为false

                               <meta-data android:name="android.max_aspect" android:value="2.4" />  意思是适配最大长宽比(自己理解,不造对不对)

3.曲面屏底部导航栏遮挡了 底部布局,需要把内容布局的高度缩小,撑起导航栏

1)布局文件中底部需要避开遮挡的布局的背景设置:  android:background="?android:attr/windowBackground"
         windowBackground 的颜色设置需要在styles.xml :
         AppTheme :  <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item>
2)在activity oncreate方法中
if(NavigationBarUtil.hasNavigationBar(this)){
    NavigationBarUtil.initActivity(findViewById(android.R.id.content));
}
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;




import java.lang.reflect.Method;

/**
 * 底部导航栏在曲面屏设置为全面屏时时,下部因为曲面原因遮挡
 * 此时就要给底部留出空间来 才不会被遮挡
 * 布局文件中底部需要避开遮挡的布局的背景设置:  android:background="?android:attr/windowBackground"
 * windowBackground 的颜色设置需要在styles.xml : AppTheme :  <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item>
 */
public class NavigationBarUtil {

    public static void initActivity(View content) {
        new NavigationBarUtil(content);
    }

    private View mObserved;//被监听的视图
    private int usableHeightView;//视图变化前的可用高度
    private ViewGroup.LayoutParams layoutParams;

    private NavigationBarUtil(View content) {
        mObserved = content;
        //给View添加全局的布局监听器监听视图的变化
        mObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                resetViewHeight();
            }
        });
        layoutParams = mObserved.getLayoutParams();
    }

    /**
     * 重置视图的高度,使不被底部虚拟键遮挡
     */
    private void resetViewHeight() {
        int usableHeightViewNow = CalculateAvailableHeight();
        //比较布局变化前后的View的可用高度
        if (usableHeightViewNow != usableHeightView) {
            //如果两次高度不一致
            //将当前的View的可用高度设置成View的实际高度
            layoutParams.height = usableHeightViewNow;
            mObserved.requestLayout();//请求重新布局
            usableHeightView = usableHeightViewNow;
        }
    }

    /**
     * 计算试图高度
     *
     * @return
     */
    private int CalculateAvailableHeight() {
        Rect r = new Rect();
        mObserved.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);//如果不是沉浸状态栏,需要减去顶部高度
//        return (r.bottom );//如果是沉浸状态栏
    }

    /**
     * 判断底部是否有虚拟键
     *
     * @param context
     * @return
     */
    public static boolean hasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {

        }
        return hasNavigationBar;

    }

    public static void setNavigationBarColor(Activity activity,int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().setNavigationBarColor(activity.getResources().getColor(color));
        }
    }


}

4.其他

<!-- 全局去除textView的文本框上下间距、设置行间距、设置字体 -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
    <item name="android:fontFamily">@font/sanshansregular</item>
    <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item>
</style>
<!-- 全局去除textView的文本框上下间距、设置行间距 -->
<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:includeFontPadding">false</item>
    <item name="android:lineSpacingExtra">@dimen/qb_px_20</item>
</style>

5. 设置字体

res/font/sanshansmedium.otf    sanshansregular.otf 

可以在布局文件中设置

android:fontFamily="@font/sanshansmedium"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值