android 适配 方案

原创 2018年04月17日 15:15:31

dp 在密度为2.5的流海屏中(锤子手机等) 会变小, 使用pt 单位适配 可以

Android原生系统API自带dp、px、sp单位转换

Android系统中自带的Api中可以使用TypedValue进行单位转换

  • 调用系统api转换单位
// 获得转换后的px值
float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 16,context.getResources().getDisplayMetrics());
  • 分析TypedValue.applyDimension搞了什么事情?
// 在TypedValue类中
/**
 * px、dp、sp、pt、in、mm单位转换
 * @param unit  转换类型
 * @param value 转换值(float)
 * @param metrics 当前设备显示密度
 * @return 转换单位后的值
 */
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
    switch (unit) {
        case COMPLEX_UNIT_PX: // 转换为px(像素)值
            return value;
        case COMPLEX_UNIT_DIP: // 转换为dp(密度)值
            return value * metrics.density;
        case COMPLEX_UNIT_SP: // 转换为sp(与刻度无关的像素)值
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT: // 转换为pt(磅)值
            return value * metrics.xdpi * (1.0f / 72);
        case COMPLEX_UNIT_IN: // 转换为in(英寸)值
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM: // 转换为mm(毫米)值
            return value * metrics.xdpi * (1.0f / 25.4f);
    }
    return 0;
}
  • 分析context.getResources().getDisplayMetrics()搞了什么事情
// 在Resource类中
final DisplayMetrics mMetrics = new DisplayMetrics();

// 构造方法,初始化了mMetrics
public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config,
         CompatibilityInfo compatInfo) {
     mAssets = assets;
     mMetrics.setToDefaults();
     if (compatInfo != null) {
         mCompatibilityInfo = compatInfo;
     }
     updateConfiguration(config, metrics);
     assets.ensureStringBlocks();
}

// 获取密度值的方法
public DisplayMetrics getDisplayMetrics() {
        if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels
                + "x" + mMetrics.heightPixels + " " + mMetrics.density);
        return mMetrics;
    }
}

// 在DisplayMetrics类中
public void setToDefaults() {
        widthPixels = 0;
        heightPixels = 0;
        density =  DENSITY_DEVICE / (float) DENSITY_DEFAULT;
        densityDpi =  DENSITY_DEVICE; // 获取密度值
        scaledDensity = density;
        xdpi = DENSITY_DEVICE;
        ydpi = DENSITY_DEVICE;
        noncompatWidthPixels = widthPixels;
        noncompatHeightPixels = heightPixels;
        noncompatDensity = density;
        noncompatDensityDpi = densityDpi;
        noncompatScaledDensity = scaledDensity;
        noncompatXdpi = xdpi;
        noncompatYdpi = ydpi;
    }

// 获取密度值    
public static int DENSITY_DEVICE = getDeviceDensity();
private static int getDeviceDensity() {
    return SystemProperties.getInt("qemu.sf.lcd_density", // 获取当前系统的密度值
            SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); // 没有,则取默认值
}

// 获取密度缺省值:160
public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
public static final int DENSITY_MEDIUM = 160;
  • 当然在实际编程中,我们一般都把单位转换写成工具类,通过工具类来调用:
/**
 * 根据手机分辨率从DP转成PX
 * @param context
 * @param dpValue
 * @return
 */
public static int dip2px(Context context, float dpValue) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
}

/**
 * 将sp值转换为px值,保证文字大小不变
 * @param spValue
 * @return
 */
public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
}

/**
 * 根据手机的分辨率PX(像素)转成DP
 * @param context
 * @param pxValue
 * @return
 */
public static int px2dip(Context context, float pxValue) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
}

/**
 * 将px值转换为sp值,保证文字大小不变
 * @param pxValue
 * @return
 */

public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhb_11/article/details/79975275

GitHub完美适配Visual Studio

Github是一个源代码控制托管平台,很多流行的开源项目使用GitHub来进行协作。比如,开源项目asp.net:就托管在Github上,你甚至可以为这个项目贡献代码。如果你没有GitHub帐户,你也可以很轻松的创建一个,它可以免费的托管你的公共代码仓库。如果你不熟悉Github的基本使用知识,一定要学习我们的Github全面详解视频教程。
  • 2017年04月25日 07:29

Android屏幕density, dip等相关概念总结

1、几个术语 VGA、HVGA、QVGA、WVGA、WQVGA 这些术语都是指屏幕的分辨率。 VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素; ...
  • wh_19910525
  • wh_19910525
  • 2016-03-15 10:50:34
  • 1463

Android:sp与dp(densityDpi与scaledDensity)

一般在布局上设置控件大小维度的单位采用dp,而采
  • annkie
  • annkie
  • 2014-11-05 15:53:52
  • 5541

Android px/dp/sp scaledDensity/density 详解

Android中的尺寸计量单位有很多,我们常用的有是3
  • ZuoMoHuaEr
  • ZuoMoHuaEr
  • 2014-09-24 15:50:11
  • 1359

开工大吉,狗年第一篇自定义View之StepView

今日科技快讯颜值经济正随着一波又一波的美颜相机不断引爆市场,而最近,今日头条3亿美金收购Faceu的消息,更是让这一市场再次成为热点,虽然美颜相机直至今天也没有形成一家独大的垄断局面,但是百花齐放的时...
  • c10WTiybQ1Ye3
  • c10WTiybQ1Ye3
  • 2018-02-22 00:00:00
  • 263

三分钟搞定安卓适配问题PPT详解

  • 2016年05月24日 14:01
  • 930KB
  • 下载

Android 屏幕适配 pt暴力适配

在application中添加代码: @Override public void onCreate() { super.onCreate(); resetDen...
  • yikunhan
  • yikunhan
  • 2018-03-27 15:01:14
  • 109

Android 适配 (使用pt单位适配)

@Override public void onCreate() { super.onCreate(); resetDensity(); } @O...
  • a136447572
  • a136447572
  • 2017-07-27 12:32:27
  • 1260

android原生browser分析(一)--Application

类Browser.java是整个应用的Application.其代码如下:   public class Browser extends Application {       @Override  ...
  • u011430511
  • u011430511
  • 2014-06-18 16:04:17
  • 1971

安卓开发工具类【转载自洪洋大神博客】

打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1、日志工具类L.java ...
  • Sean_css
  • Sean_css
  • 2016-09-26 21:50:45
  • 1985
收藏助手
不良信息举报
您举报文章:android 适配 方案
举报原因:
原因补充:

(最多只允许输入30个字)