再议屏幕适配

之前对屏幕分辨率和像素的只是做过讨论,可见文章:http://blog.youkuaiyun.com/carter_yu/article/details/50421787

一、Android中的屏幕知识

  • 像素:(px)每张图片都是由色点组成的,每个色点就是一个像素,像素的大小是可以变化的,所以也成为“相对长度”;相机所说的像素,实指最大像素数,如200万 = 1600 * 1200 ,像素是由相机里的光电传感器上的光敏元件数目所决定的,一个光敏元件就对应一个像素。因此像素越大,意味着光敏元件越多,相应的成本就越大。

  • 屏幕分辨率:就是屏幕每行的像素点数*每列的像素点数;手机的分辨率在出厂时就是已经确定好的,不可改变。

  • 图像分辨率:每英寸图像内的像素点数。图像分辨率是有单位的,叫像素每单位(px/in);

  • 屏幕大小:只屏幕对角线的物理长度,不可改变,用英寸(in)表示;

  • 屏幕像素密度:(ppi)是指屏幕对角线上每英寸的像素数量;正常距离下,PPI高于300时,人眼已经无法辨别像素点。

二、实例介绍(已荣耀7为例)

屏幕参数

屏幕大小

在上图可以看出,荣耀7的屏幕分辨率是1920*1080,就是说手机横屏上有1920个像素点,竖屏有1080个像素点;

屏幕尺寸5.2寸(英寸),就是对角线的长度为5.2英寸,1英寸 = 2.54cm,所以对角线长度是13.2厘米。

屏幕像素密度424ppi,是说对角线上每英寸存在的像素数为424,可以根据下列公式计算,对角线像素数约为2202,对角线长度为5.2英寸,故每英寸的像素数约为424。

这里写图片描述

屏幕分辨率和屏幕尺寸没有关系。每英寸像素数(PPI)是两者共同决定的,PPI越高,屏幕越清晰。所以我们可以得出:并不是分辨率越高,屏幕越清晰,合适的屏幕分辨率搭配合适的尺寸,才能达到高质量的屏幕质量。

三、关于像素大小

像素的大小是不固定的,但是,一台电子设备,出厂后的屏幕分辨率和像素的物理大小就是确定的了。

为什么电脑可以调节屏幕分辨率?

电脑的实际分辨率就是最大分辨率,而调节到较小分辨率时,实际是通过填充一些模拟色块,将屏幕分辨率凑到硬件的实际分辨率。

四、开发人员适配

Android中会有dp(dip)、px、dpi、density。

  • dip:就是dp,设备无关像素;

  • px:像素,不过多介绍;

  • dpi:dots per inch ,每英寸的像素点数,也叫像素密度(px/inch);

  • density:密度,density = 实际dpi/标准dpi,即 实际dpi /160;

根据定义,当dpi为160时,dp等于px,我们得1dp = 160*1inch;

又有dpi定义得:1px = 1dpi*1inch;==>1px = 1dpi*(1dp/160) = (1dpi/160)*1dp;

所以,dp和px的换算公式为:

1dp = px/(Dpi/160) = (px*160)/Dpi = px / 密度;

1px = dp * (Dpi/160) = dp * 密度;

总结,

120dpi(ldpi低密度屏)   1dp = 0.75px ( 标准: 320*240)(由于像素点是物理点,所以用2个像素点来显示3个dp的内容)

160dpi(mdpi中密度屏)   1dp = 1px ( 标准: 480*320)

213dpi(tvdpi电视密度屏)  1dp = 1.33px

240dpi(hdpi高密度屏)   1dp = 1.5px( 标准: 800*480)

320dpi(xhdpi极高密度屏)  1dp = 2px( 标准: 600*124)

图片适配

按照中密度屏给出UI,然后进行放在不同dpi的图片文件夹中;

尺寸适配

在不同dpi的values文件中,按照公式进行换算。

Sub 统计科室病例类型() Dim wsSource As Worksheet, wsResult As Worksheet Dim dict As Object, lastRow As Long, i As Long Dim deptCol As Integer, typeCol As Integer Dim outputRow As Long, caseTypes As Variant ' 初始化病例类型数组(顺序与输出列对应) caseTypes = Array("正常病例", "高倍率病例", "低倍率病例", "未入组病例", "特病单议病例") ' 设置数据源 Set wsSource = ThisWorkbook.Sheets("病例综合查询") Set dict = CreateObject("Scripting.Dictionary") ' 创建/清空结果表 On Error Resume Next Set wsResult = ThisWorkbook.Sheets("统计结果") If wsResult Is Nothing Then Set wsResult = Worksheets.Add wsResult.Name = "统计结果" End If wsResult.Cells.Clear On Error GoTo 0 ' ===== 定位关键列 ===== deptCol = FindColumn(wsSource, "出院科室") typeCol = FindColumn(wsSource, "病例类型") ' 错误处理 If deptCol = 0 Or typeCol = 0 Then MsgBox "未找到关键列,请检查列标题", vbCritical Exit Sub End If ' ===== 核心统计逻辑 ===== lastRow = wsSource.Cells(wsSource.Rows.Count, deptCol).End(xlUp).Row For i = 2 To lastRow Dim department As String, caseType As String department = Trim(wsSource.Cells(i, deptCol).Value) caseType = Trim(wsSource.Cells(i, typeCol).Value) If department <> "" And caseType <> "" Then UpdateDictionary dict, department, caseType, caseTypes End If Next ' ===== 结果输出 ===== With wsResult ' 创建表头 .Range("A1:G1") = Array("科室", "病例总数", "正常病例", "高倍率病例", _ "低倍率病例", "未入组病例", "特病单议病例") outputRow = 2 ' 填充数据 For Each key In dict.keys() Dim arr: arr = dict(key) .Cells(outputRow, 1).Value = key .Cells(outputRow, 2).Value = arr(0) ' 总病例数 For j = 0 To UBound(caseTypes) .Cells(outputRow, 3 + j).Value = arr(j + 1) ' 各类型病例数 Next outputRow = outputRow + 1 Next ' ===== 格式优化 ===== FormatOutput wsResult, outputRow, caseTypes End With MsgBox "统计完成,共处理 " & lastRow - 1 & " 条记录", vbInformation End Sub ' 辅助函数:定位列位置 Function FindColumn(ws As Worksheet, colName As String) As Integer For i = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column If ws.Cells(1, i).Value = colName Then FindColumn = i Exit Function End If Next FindColumn = 0 End Function ' 辅助函数:更新字典数据 Sub UpdateDictionary(dict As Object, dept As String, caseType As String, caseTypes As Variant) If Not dict.Exists(dept) Then ' 初始化数组:总病例数+5种类型(初始值全为0) dict.Add dept, Array(0, 0, 0, 0, 0, 0) End If Dim arr: arr = dict(dept) arr(0) = arr(0) + 1 ' 总病例数+1 ' 匹配病例类型 For i = 0 To UBound(caseTypes) If caseType = caseTypes(i) Then arr(i + 1) = arr(i + 1) + 1 Exit For End If Next dict(dept) = arr ' 更新字典 End Sub ' 辅助函数:格式化输出 Sub FormatOutput(ws As Worksheet, lastRow As Long, caseTypes As Variant) With ws ' 设置表头格式 With .Range("A1:G1") .Font.Bold = True .Interior.Color = RGB(191, 191, 191) .HorizontalAlignment = xlCenter End With ' 自动调整列宽 .Columns("A:G").AutoFit ' 设置数字格式 .Range("B:G").NumberFormat = "0" ' 添加边框 .Range("A1:G" & lastRow).Borders.LineStyle = xlContinuous ' 添加汇总行 .Cells(lastRow, 1).Value = "总计" .Cells(lastRow, 2).Formula = "=SUM(B2:B" & lastRow - 1 & ")" For i = 0 To UBound(caseTypes) .Cells(lastRow, 3 + i).Formula = "=SUM(" & Split(Cells(1, 3 + i).Address, "$")(0) & _ "2:" & Split(Cells(1, 3 + i).Address, "$")(0) & lastRow - 1 & ")" Next .Rows(lastRow).Font.Bold = True End With End Sub 我要求的是在该宏代码的基础上修改,请重做
最新发布
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值