最有效的方式来适配
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; } }
相关文章推荐
- 三种屏幕适配的方式
- 自定义控件的方式适配图片,以及里面的一些技巧
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式
- Android AutoLayout全新的适配方式
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式 堪称适配终结者(转)
- golang有用的库及工具 之 fasthttp客户端 最通用最有效最简单使用方式
- 自定义控件的方式适配图片,以及里面的一些技巧
- 2015年十大互联网最有效的免费推广方式
- 可适配平板、手机的Web开发方式
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式 堪称适配终结者
- 用最有效的方式算出2*8等于几
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android AutoLayout全新的适配方式 堪称适配终结者
- 分析最常见最有效的公共传播方方式
- 关于屏幕适配问题几种思路与方式