您的位置:首页 > 其它

最有效的方式来适配

2018-07-18 17:52 363 查看

最有效的方式来进行屏幕适配

以下的代码是根据今日头条发布的代码改变来的:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA

在上代码之前先把屏幕相关的几个概念搞清楚:Density、DensityDpi、ScaleDensity。这里我们不过多讲解这些概念知识。

1.0 获取设计图的屏幕尺寸:这里我以360dp为例。

在manifest文件进行声明:

<!--按照DP 标注设计图上的尺寸 -->
<meta-data
android:name="fit_width"
android:value="360" />
<meta-data
android:name="fit_height"
android:value="640" />

package com.qu.ale.fitscreen.widget;

import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.res.Configuration;
import android.support.annotation.Nullable;
import android.util.DisplayMetrics;
import android.util.Log;

import com.qu.ale.utils.DeviceScreen;

/**
* @描述 dimmension
* @作者 阿乐
* @创建时间 2018/7/18 15:32
* @邮箱 1123599561@qq.com
*/
public class CustomDimmension {
private static float mDensity;
private static float mscaledDensity;
private static float mScreenWidth;
private static float mScreenHeight;
private static float mDesignWidth;
private static float mDesignHeight;
public static void setCustomDimmension(@Nullable final Application application,
@Nullable Activity activity,@Nullable boolean isFitWidth){
DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if(mDensity == 0){
float[] sizes = DeviceScreen.getScreenWidthandHeight(application);
if(isFitWidth){

mScreenWidth = appDisplayMetrics.widthPixels;
mDesignWidth = sizes[0];
}else{

//适配的高度是不包括状态栏、菜单栏
mScreenHeight = appDisplayMetrics.heightPixels - DeviceScreen.getStatusBarHeight(application);
mDesignHeight = sizes[1];
}
mDensity = appDisplayMetrics.density;
mscaledDensity = appDisplayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig != null && newConfig.fontScale > 0){
mscaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {}
});
}

//重新计算Density、DensityDpi、scaleDensity
float targetDensity;
int targetDensityDpi;
float scaledDensity;
if(isFitWidth) {
targetDensity = mScreenWidth / mDesignWidth;
targetDensityDpi = (int) targetDensity * 160;
scaledDensity = targetDensity * (mscaledDensity / mDensity);
}else {
targetDensity = mScreenHeight / mDesignHeight;
targetDensityDpi = (int) targetDensity * 160;
scaledDensity = targetDensity * (mscaledDensity / mDensity);
}

appDisplayMetrics.density = targetDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
appDisplayMetrics.scaledDensity = scaledDensity;

final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;
activityDisplayMetrics.scaledDensity = scaledDensity;

}
}

自带的工具:

ackage com.qu.ale.utils;

import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.util.Log;

import java.lang.reflect.Field;

/**
* @描述 获取屏幕尺寸
* @作者 阿乐
* @创建时间 2018/7/18 17:05
* @邮箱 1123599561@qq.com
*/
public final class DeviceScreen {
public static float[] getScreenWidthandHeight(Application application){
float[] sizes = new float[2];
PackageManager packageManager = application.getPackageManager();
ApplicationInfo applicationInfo = null;
try {
applicationInfo = packageManager.getApplicationInfo(application.getPackageName(),
PackageManager.GET_META_DATA);

if(applicationInfo != null && applicationInfo.metaData != null &&
applicationInfo.metaData.containsKey("fit_width") &&
applicationInfo.metaData.containsKey("fit_height")){
String width = String.valueOf(applicationInfo.metaData.getInt("fit_width",360));
String height = String.valueOf(applicationInfo.metaData.getInt("fit_height",640));
sizes[0] = Float.parseFloat(width);
sizes[1] = Float.parseFloat(height);

}
}catch (PackageManager.NameNotFoundException e){

}
return sizes;
}

public static int getStatusBarHeight(Application application) {
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
return application.getResources()
.getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: