zoukankan      html  css  js  c++  java
  • 屏幕适配专题 关于分辨率,dp,density等

    先来个公式: 实际的PX = dp/160 * dpi

    又发现一个好方法getResources().getDimensionPixelSize(R.dimen.shop_ser_height)  传入一个dimen,用dp单位

    在不同系统上自动转换为pixel

    如:dimen为60dp,则在720p上得到120p(x2),480p机器上得到90p(x1.5),320p机上得到60p(x1).........

    =============

    适配原则:20130422

    mdpi的手机,若无mdpi包才找到原装不说明的layout包;---默认包最不优先

    hdpi的手机,若无hdpi的包,有mdpi和xhdpi,则找xhdpi的包;---默认先向分辨率更高的查找

    xhdpi的手机,若无xhdpi的包,只有hdpi和更低的分辨率,则找hdpi的包;---没有更高分辨率的,则找分辨率低的最少的

    =======

    块1,屏幕的density一般为

    300--xhdpi;   如4.5寸的1280x720

    240--hdpi;    如4.0寸的800x480---4.3寸的960x540

    160---mdpi;  如3.2,3.5的480x320

    120---ldpi;    如240x320

    (视网膜分辨率为300dpi)

    块2,换算: dp=dip=density-igore pixels

      dip(value)=(int) (px(value)/1.5 + 0.5) ???

          实际上当160dpi时,1px=1dp,

          当240dpi时,1dp=160/240   px=2/3px

          所以如果用px的单位,当160dpi时用60,当240dpi时为90。

      this.getResources().getDisplayMetrics().density可获得系统当前DPI, 160DPI为1,120DPI为0.75,240DPI为1.5。

    块3,相关的一个例子:

    box.removeAllViews();//box is container, View.inflate 来生成View
                        box.addView(View.inflate(ShopMainActivity.this, R.layout.shop_service, null));
                        LinearLayout shopService = (LinearLayout)findViewById(R.id.shop_service); //shop_service是ListView所在页面
                        //以下一段代码动态生成一个ListView,动态设置页面长度,如果不这样ListView会与ScrollView冲突
                        ListView serviceListView = new ListView(ShopMainActivity.this);
                        serviceListView.setBackgroundResource(R.drawable.table_style);
                        serviceListView.setPadding(8, 0, 8, 0);
                        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams
                                (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                        params.height = (int) (6*(61*(ShopMainActivity.this.getResources().getDisplayMetrics().density))) ;  
                        serviceListView.setLayoutParams(params);
                        shopService.addView(serviceListView);
                        //设置Adapter
                        List<Map<String,String>> serviceList = new ArrayList<Map<String,String>>();
                        for(int i=0;i<6;i++){
                            Map<String,String> map = new HashMap<String,String>();
                            map.put("name", "更换机油");
                            map.put("detail", "更换机油免费30项检查,不分车价工时30元x6");
                            serviceList.add(map);
                        }
                        SimpleAdapter serviceAdapter = new SimpleAdapter(ShopMainActivity.this,serviceList,
                                R.layout.shop_service_row,new String[]{"name" , "detail"},
                                new int[]{R.id.shop_service_name , R.id.shop_service_detail});
                        serviceListView.setAdapter(serviceAdapter);
                    
                        
                        
                        break;
  • 相关阅读:
    [错误处理]UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
    [已解决]使用 apt-get update 命令提示 ...中被配置了多次
    linux各种版本查看方法
    [Pandas技巧] 如何把pandas dataframe对象或series对象转换成list
    linux下终止相关操作
    [错误处理]Vim卡死,无法输入是怎么回事?是不是按了Ctrl+S
    批量修改文件名称方法
    pycharm配置 自动运行指定脚本
    pip安装超时,更换国内镜像源安装
    命令行特殊字符名字转义
  • 原文地址:https://www.cnblogs.com/linxiaojiang/p/2966115.html
Copyright © 2011-2022 走看看