//------------------------------------------------------------------屏幕适配-----------------------------------------------------------------------------
//-------------------------------------------------------------------------------------第一步:
首先studio依赖compile 'com.zhy:autolayout:1.4.3'
配置:
默认使用的高度是设备的可用高度,也就是不包括状态栏和底部的操作栏的,如果你希望拿设备的物理高度进行百分比化:
可以在Application的onCreate方法中进行设置:
public class UseDeviceSizeApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
AutoLayoutConifg.getInstance().useDeviceSize();
}
}
//-------------------------------------------------------------------------------------第二步:
在AndroidManifest.xml文件下添加设计尺寸
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shipei.ui" >
<application
android:name="com.shipei.application.UseDeviceSizeApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
//设计稿尺寸
<meta-data android:name="design_width" android:value="720">
</meta-data>
<meta-data android:name="design_height" android:value="1920">
</meta-data>
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
//---------------------------------------------------------------------------------------------第三步:
让你的Activity继承自AutoLayoutActivity.
非常简单的两个步骤,你就可以开始愉快的编写布局了,详细可以参考sample。
其他用法
如果你不希望继承AutoLayoutActivity,可以在编写布局文件时,将
LinearLayout -> AutoLinearLayout
RelativeLayout -> AutoRelativeLayout
FrameLayout -> AutoFrameLayout
这样也可以完成适配
//---------------------------------------------------------------------------------------------------第四步:
将布局单位dp/dip改为px。
//-------------------------------------------------------虚拟按键适配---------------------------------------------------------------------
//------------------------------------------------第一步 一个工具类-------------------------------------------------------
public class AndroidBug54971Workaround {
public static void assistActivity(View content) {
new AndroidBug54971Workaround(content);
}
private View mChildOfContent;
private int usableHeightPrevious;
private ViewGroup.LayoutParams frameLayoutParams;
private AndroidBug54971Workaround(View content) {
mChildOfContent = content;
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
possiblyResizeChildOfContent();
}
});
frameLayoutParams = mChildOfContent.getLayoutParams();
}
private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious) {
frameLayoutParams.height = usableHeightNow;
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
return (r.bottom);
}
public static boolean checkDeviceHasNavigationBar(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;
}
}
//------------------------------------第二步 调用,调用时候注意,要调用xml里的父布局id才行。就是最外层的布局id。-----------------
AndroidBug54971Workaround.assistActivity(findViewById(R.id.mbuttonTabar));
//--------------------------------------------------------------刘海屏适配----------------------------------------------------------------------------
//-------------------------------------------第一步 导依赖------------------------------------
implementation 'com.yanzhenjie:sofia:1.0.5'
//------------------------------------------------第二步 调用------------------------------------------------------------------------
//-------------------------一般需要调用这三个属性就可以刘海屏适配了。-----------------------------------------------
//刘海屏幕适配
Sofia.with(this).
statusBarBackgroundAlpha(0)
.invasionStatusBar()
.invasionNavigationBar();
//-----------------------------------介绍一下刘海屏适配的属性----------------------------------------------------------------
Android沉浸式效果的实现,状态栏和导航栏均支持设置颜色、渐变色、图片、透明度、内容入侵和状态栏深色字体;
兼容竖屏、横屏,当屏幕旋转时会自动适配。
Sofia.with(Activity);
调用with方法后返回一个Bar接口,可以链式连续调用所有方法,方法列表如下:
// 状态栏深色字体。
Bar statusBarDarkFont();
// 状态栏浅色字体。
Bar statusBarLightFont();
// 状态栏背景色。
Bar statusBarBackground(int statusBarColor);
// 状态栏背景Drawable。
Bar statusBarBackground(Drawable drawable);
// 状态栏背景透明度。
Bar statusBarBackgroundAlpha(int alpha);
// 导航栏背景色。
Bar navigationBarBackground(int navigationBarColor);
// 导航栏背景Drawable。
Bar navigationBarBackground(Drawable drawable);
// 导航栏背景透明度。
Bar navigationBarBackgroundAlpha(int alpha);
// 内容入侵状态栏。
Bar invasionStatusBar();
// 内容入侵导航栏。
Bar invasionNavigationBar();
// 让某一个View考虑状态栏的高度,显示在适当的位置,接受ViewId。
Bar fitsStatusBarView(int viewId);
// 让某一个View考虑状态栏的高度,显示在适当的位置,接受View。
Bar fitsStatusBarView(View view);
// 让某一个View考虑导航栏的高度,显示在适当的位置,接受ViewId。
Bar fitsNavigationBarView(View view);
// 让某一个View考虑导航栏的高度,显示在适当的位置,接受View。
Bar fitsNavigationBarView(View view);
fitsStatusBarView()一般用在产品详情页,假设需求如图三所示。在内容入侵状态栏后,我们的布局整体上移到状态栏,那么Toolbar的一部分也会显示在状态栏下方(层级),这个时候就需要Toolbar考虑系统状态栏的高度显示在适当的位置了;fitsNavigationBarView()同理,只是显示在屏幕的最底部(竖屏)或者最右侧(横屏)。
注意:Sofia.with(Activity)调用后会返回一个Bar接口实例,开发者可以连续调用某几个方法。在页面滑动时如果需要再次改变SystemBar的颜色,那么开发者可以保存这个Bar实例为Activity的成员变量,也可以不保存,在重复改变时再次调用Sofia.with(Activity),此时还是会返回上次返回给开发者的Bar接口实例。
//----------------------------------------------------------------完-----------------------------------------------------------------------------