精华内容
下载资源
问答
  • 修改系统density densityDpi 做屏幕适配

    千次阅读 2019-07-09 17:14:35
    dp:设备独立像素值 也就是我们在布局文件中 自己定义的 但是最终也会由系统根据一定的比值转换成 px,这是由谷歌帮我们做的适配,使用 dp值 dpi:手机屏幕每英寸所包含像素点的数量 那么这个dpi是怎么求得了? 接下来...

    我们先来复习一下 Android中 dp dpi px 它们之间的关系?

    dp:设备独立像素值 也就是我们在布局文件中 自己定义的 但是最终也会由系统根据一定的比值转换成 px,这是由谷歌帮我们做的适配,使用 dp值

    dpi:手机屏幕每英寸所包含像素点的数量 那么这个dpi是怎么求得了? 接下来我们回来把它求出来的

    px:像素点,假如手机的分辨率是 720*1280 那么手机横向排列的像素点 总共就是 720个点,就是720px,纵向排列的点总共就是1280个点,就是1280px, 手机屏幕上每一个点就是一个像素,下面我们通过一张图来具体说明他们之间的关系

    在这里插入图片描述

    假如:手机分辨率为 720*1280 屏幕尺寸 5寸
    那么
    px 手机屏幕的横向分辨率就是 720px,纵向分辨率就是 1280px
    dpi 就可以利用勾股定理求出
    在这里插入图片描述
    在这个分辨率和屏幕尺寸下大约 dpi=294

    而在android中 当每英寸像素为 160 ,每英寸dpi为160是 此时 1dp=1px, 160也是android中的一个 参考值,基准值
    在这里插入图片描述
    而此时我们的dpi为 294
    在这里插入图片描述

    此时 1dp=1.8px
    那么它的最大dp值是多少了? 我们总不能设置在布局文件中写5000dp吧,显然这种屏幕不存在
    既然 1dp=1.8px 那么 720/1.8px=400 它的最大宽度为400个dp

    此时 我们的UI小姐姐 出图的设计稿 也是基于 720*1280 5寸 ,要求我们界面中的一个button按钮的宽度 要显示屏幕的一半,那么根据屏幕分辨率为720px 的话 宽度的一半就是 360px,360px对应dp应该多大了 此时 1dp=1.8px 所有 360/1.8=200dp
    我们只需要在布局文件中设置200个dp就可以了 ,

    那么问题就来了 ,我们在 7201280的分辨率下 这是200dp 肯定是占屏幕尺寸的一半,那我们在 10801920 5.5英寸下 同样设置200dp? 他能站屏幕的一半吗? 在此分辨率下 dpi=400 那么 1dp=400/160=2.5px
    1dp=2.5px 那么 200dp 2002.5=500px 500px肯定没有达到屏幕的一半啊 那么原因是什么了? 肯定就是 这个 2.5系数了 ,很明显这个2.5 系数 不对导致的 那我们逆向推理 1080的一半为 540 这个是不能变 200是布局文件中写的不能变 那么
    540/200=2.7 那么2.7就是这个系数了 因为2.7
    200=540 那么刚好是屏幕的一半,但是这个2.7是我们逆推出来的,刚开始我们也不知道啊 ? 我们尝试让这两个 分辨率 建立联系 然后最好能得到 2.7这个值

    我们用 1080px 除以 400dp 那么刚好等于 2.7 那么 我们就找到它们的联系了
    用这个 2.7*200=540 200是布局文件设置的值 没有变 系数是求出的 它刚好等于540 就是我们屏幕的一半了

    现在我们来 看看 这个 2.5 和 2.7的关系?

    2.5 是根据常规方式求出来的 也就是说 在 1080*1920 分辨率下,系统默认就是 2.5这个系数 而这个系数其实就是 我们的系统密度 density ,那么我们把这个density改成2.7 不就完美实现适配了吗?

    下面进入真正的主题 修改系统 density scaledDensity densityDpi

    新建Density工具类

    public class Density {
    
        private static final float  WIDTH =400;//参考设备的宽,单位是dp 400/ 2 = 200
    
        private static float appDensity;//表示屏幕密度
        private static float appScaleDensity; //字体缩放比例,默认appDensity
    
        public static void setDensity(final Application application, Activity activity){
            //获取当前app的屏幕显示信息
            DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
            if (appDensity == 0){
                //初始化赋值操作
                appDensity = displayMetrics.density;
                appScaleDensity = displayMetrics.scaledDensity;
    
                //添加字体变化监听回调
                application.registerComponentCallbacks(new ComponentCallbacks() {
                    @Override
                    public void onConfigurationChanged(Configuration newConfig) {
                        //字体发生更改,重新对scaleDensity进行赋值
                        if (newConfig != null && newConfig.fontScale > 0){
                            appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                        }
                    }
    
                    @Override
                    public void onLowMemory() {
    
                    }
                });
            }
    
            //计算目标值density, scaleDensity, densityDpi
            float targetDensity = displayMetrics.widthPixels / WIDTH; //  720/ 400 = 1.8
            float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
            int targetDensityDpi = (int) (targetDensity * 160);
    
            //替换Activity的density, scaleDensity, densityDpi
            DisplayMetrics dm = activity.getResources().getDisplayMetrics();
            dm.density = targetDensity;
            dm.scaledDensity = targetScaleDensity;
            dm.densityDpi = targetDensityDpi;
        }
    
    }
    
    
    public class MainActivity extends Activity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Density.setDensity(getApplication(), this);
            setContentView(R.layout.activity_main);
        }
    }
    
    
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
    
       <TextView
           android:id="@+id/text"
           android:layout_width="200dp" //参考尺寸的一半
           android:layout_height="355dp"//711的一半 参考尺寸的一半 均可求出
           android:text="Hello World!"
           android:background="@color/colorAccent"
          />
    
    
    </LinearLayout>
    

    运行上面代码 在
    720*1280分辨率上的效果 看看是否宽 高都占一半
    在这里插入图片描述

    宽度没有任何问题 通过计算 720/400200=360 高度了?差了一点 其实通过计算我们也能看出来 3551.8=639 而分辨率1280的一半是640 差了一个像素

    我们在华为 手机 分辨率 2160*1080 分辨率下再来看看?

    在这里插入图片描述
    宽度没有任何问题 通过计算 1080/400200=540
    高度 1080/400
    355=958.5 而2160/2=1080 1080-958=122px 差了 122的像素

    我们再来看看小米手机 1080*2240 根据这个分辨率可以看出 宽度肯定占屏幕的一半,高度差了166个px值,
    可以看出在 16:9 的屏幕上效果更好,2:1的比例上有些出入,还是需要加入其它的一些计算

    展开全文
  • 于是做了这么个小工具,专门用于系统dpi缩放参数的检测。 程序下载:链接: https://pan.baidu.com/s/1XR2nvwYWFKd6DH6PMCeNyQ 提取码: hvff 程序运行效果图: 如果修改一下程序属性里的兼容性,更改高dpi设置...

    最近在做高DPI显示器的适配,由于很多用户不知道自己的显示器是否有dpi缩放。于是做了这么个小工具,专门用于系统dpi缩放参数的检测。

    程序下载:链接: https://pan.baidu.com/s/1XR2nvwYWFKd6DH6PMCeNyQ 提取码: hvff

    程序运行效果图:

     

    如果修改一下程序属性里的兼容性,更改高dpi设置,高dpi缩放替代,选择 系统,那么运行效果也会不同

    如图

     

    程序下载:链接: https://pan.baidu.com/s/1XR2nvwYWFKd6DH6PMCeNyQ 提取码: hvff

     

    源码分享:

    function getDPI(var h1:integer; var h2: integer): integer;
    var
      DC: HDC;
    begin
      DC := GetDC(0);
      Result := GetDeviceCaps(DC, logpixelsx); //获取逻辑dpi,如果由系统负责缩放那么获取的值固定为96
      h1:=  GetDeviceCaps(DC, DESKTOPHORZRES); //当程序属性,兼容,更改高dpi设置,高dpi缩放替代,选择 应用程序,那么 h1,h2相同
      h2:=  GetDeviceCaps(DC, HORZRES);   //当程序属性,兼容,更改高dpi设置,高dpi缩放替代,选择 系统,那么 h2比 h1 小
      ReleaseDC(0, DC);
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    var k,h1,h2,j: integer;
        s: string;
    begin
       k:=    getDPI(h1,h2);

        memo1.Lines.Add('屏幕实际像素:'+ h1.ToString+ ' 屏幕逻辑像素:'+ h2.ToString);
       memo1.Lines.Add('当前逻辑DPI(每英寸点数)是:'+ inttostr(k));
       if h1=h2 then
        begin
            j:= round(k / 96*100);
            if j=100 then
             memo1.Lines.Add('当前程序没有缩放。')
            else
              memo1.Lines.Add('当前程序缩放由程序自己完成。');
         end   else  begin
                      j:= round(h1 / h2*100);
                      memo1.Lines.Add('当前程序缩放由操作系统完成。');
                     end;

            if j=100 then
             s:= s+ '当前DPI没有放大,值为:'+ j.ToString +'%'
              else
               s:= '当前DPI已经放大,值为:'+ j.ToString +'%';
            memo1.Lines.Add(s );


    end;

     

    源码下载:链接: https://pan.baidu.com/s/1DBi-saG_0Lh4Y-mtTM_7zA 提取码: 5ea7

    代码比较简单,主要是程序的缩放主体不同的话判断逻辑上有区别。

     

    展开全文
  • DPI尺寸影响程序界面显示.

    千次阅读 2012-04-16 11:05:53
    如果发现自己的编写的 有固定窗口大小的程序... 而有些用户的为了适合自己的,修改了操作系统中的DPI设置,或放大或缩小. 这时,我们的程序就显示不正常了. 解决办法当然是动态调整了.具体实现我就没有去研究了.  DPI

    如果发现自己的编写的 有固定窗口大小的程序界面中出现了界面显示不全,有部份被遮挡,

    又或者界面上的控件或者显示区域中原来正常的显示的东西,现在却显示不完全.

    那就是 DPI 发威了.

    我们一般使用的都是 96DPI. 而有些用户的为了适合自己的,修改了操作系统中的DPI设置,或放大或缩小.

    这时,我们的程序就显示不正常了.

    解决办法当然是动态调整了.具体实现我就没有去研究了.

     DPI尺寸影响程序界面显示.

    展开全文
  • 在Android中对壁纸的管理是通过WallpaperManager.java来处理的,在做系统开发的时候可能会涉及到修改默认的壁纸,默认的壁纸路径为: ./Android4.0.3/frameworks/base/core/res/res/drawable-*large-dpi/default_...
    在Android中对壁纸的管理是通过WallpaperManager.java来处理的,在做系统开发的时候可能会涉及到修改默认的壁纸,默认的壁纸路径为:

    ./Android4.0.3/frameworks/base/core/res/res/drawable-*large-dpi/default_wallpaper.jpg

    我们可能会在系统的壁纸选择中加入我们自己的壁纸,系统壁纸是Launcher模块中加入的,我们只需要修改:



    ./packages/apps/Launcher2/res/values-sw600dp/wallpapers.xml

    在其中加入我们修改的壁纸的

    <item>wallpaperName</item>

    即可。
    展开全文
  • 最近习惯将系统的鼠标速度降低... 搜索了一下百度, 还有不少人反映这个问题, 但都是放弃之, 无奈自己写了一个鼠标速度锁定的工具, 、该工具会保持你期望的系统鼠标移动速度, 即使游戏客户端的修改后也会自动还...
  • 本人花了一周的时间写了个Wear OS工具箱,利用传统的ADB命令+Windows CMD 命令行原理。...可以做到给手表安装第三方平台APP,以及修改分辨率和修改DPI可以根据自己的喜好来给手表DIY。是搞机搞表一族的必备法宝。
  • 突然收到测试小姐姐一条消息:有bug,课程名称显示不全,而且也没有“...”。 我:不可能吧,是不是你...windows系统提示:修改“显示大小”会更改文本大小。看到这句话突然想到了DPIDPI是什么? DPI全称D...
  • 4、软件里的某些参数是可以手工修改的,例如图片尺寸、圆角尺寸、外框宽度等数值型参数,你可以根据自己的需要做出修改,当然并不推荐这样。这里特别指出,图片尺寸可以选择原始尺寸输出,假如你关闭了圆角及按钮化...
  • 系统菜单/关闭按钮/开始按钮/屏幕四角鼠标/窗口/全局升级数据库内核增加若干窗口功能增加显示桌面增加强制最小化增加改变窗口透明度增加粘贴文本增加移除USB设备高权限程序无法执行问题改变显示DPI后窗口无法居中...
  • (1) 扫描设置不当,扫描图像时的扫描分辨率(Resolution)一般应设为300dpi,如果文档字体较小则需要将扫描分辨率设定为更高值如400dpi或600dpi。缩放比例(Scaling)设为100%,亮度阀值(Threshold,Brightness)需根据...
  • Android插件

    2018-08-27 10:41:24
    可根据后缀快速完成代码,这个属于拓展吧,系统已经有这些功能,如sout、notnull等,这个插件在原有的基础上增添了一些新的功能,我更想做的是通过原作者的代码自己定制功能,那就更爽了 19.Android Holo Colors ...
  • 调整图像分辨率(DPI):图像分辨率即图像中每单位打印长度显示的像素数目,通常用每英寸点数(DPI)表示,使用此软件您可以轻松地修改图片的分辨率,以使打印机打出最好质量的图片。 添加图片的标题(描述):您...
  • 图像分辨率即图像中每单位打印长度显示的像素数目,通常用每英寸点数(DPI)表示,使用此软件您可以轻松地修改图片的分辨率,以使打印机打出最好质量的图片。 16、添加图片的标题(描述): 您只需事先给每张图片命...
  • 改进了高 DPI Windows 显示模式的兼容性。 17. 错误修正: a) 如果压缩文件包含一个大于 8 GB 的文件, 则 WinRAR 打开 tar 或 tar.gz 压缩 文件可能会失败; b) WinRAR 关联菜单在 Windows 7 beta 中不能正常...
  • 高分屏、分辨率、DPI、PPI,及 Qt 处理高分屏 Qt 项目(Cmake)设置国际化支持 如何构建 QT5(5.15) 在 Mac 编译成功运行 qt5.15 源码:debug 和 release 版本 第十部分:项目 网络 QT5/C++项目:基于QT的跨平台...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发 既 有用又有吸引力的移动...
  • 欢迎大家推荐自己在Android开发过程中用的好用的工具、学习开发教程、用到设计素材,欢迎Star、Fork 。 目录 AndroidDevTools Android Tools Android Studio SDK Tools SDK Platform-Tools Build-Tools SDK ...
  •  3.13.4 把大的事务隔离到它们自己的回滚段上  3.13.5 更简便的方法:UNDO表空间  3.13.6 监控UNDO空间  3.14 结束有问题的会话  3.15 不要在SYSTEM或SYSAUX表空间中执行排序  3.16 在不同磁盘和控制器上存放...
  • Evolving Objects:基于模板的,ANSI C++演化计算库,能够帮助你非常快速地编写出自己的随机优化算法。 frugally-deep:使用Keras模型的C++库,只有头文件。 Genann:简单的神经网络C库。 MXNet:轻量级、便携、...
  • 注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。 Rem Message Sample:@Rem Here is the description. 5.Pause 命令 运行 Pause 命令时,将显示...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

自己修改系统dpi