dp计算

博客探讨了Android开发中dp和px的区别,解释了英寸、ppi的概念,并详细介绍了dp与px之间的转换关系,强调了dp在不同分辨率屏幕上的适应性,帮助理解Android界面设计中的尺寸单位使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先什么是dp?什么是px?dppx有什么区别?dppx之间的转换关系?

1.什么px?图像显示的基本单元,我们知道屏幕是由很多点组成的,因为点特别小,所以我们看起来就像是一片的。那其中的每一个点就是像素点,而px呢?就表示1px=160个像素点。

什么是英寸?英寸就相当于一个长度单位,和厘米一样。平时我们都说手机是多少多少英寸的?那这个英寸到底是表示哪里呢?其实我们平时说的手机是多少多少英寸的,是说手机的屏幕对角线,通过比较手机屏幕的对角线长度进而比较手机屏幕的大小?

我们平时经常说手机的分辨率是多大,1920x1080,这个表示什么意思呢?表示屏幕高有1920个像素点,宽有1080个像素点。那到这里我们就要引入一个新的概念了ppi。那什么是ppi呢?ppiPixel per inch)每英寸像素数。我们把前面的总结一下。手机1920X1080分辨率,4.96英寸,那怎么求ppi呢?

其实非常简单,4.96英寸表示屏幕的对角线,问题就是要求出对角线上有多少个像素点。这个勾股定理秒解。所以一英寸就有这么多像素点:sqrt(1920*1920+1080*1080)/4.96.

又引出一个问题了,我们知道手机有很多种分辨率,而开发应用时,设计界面,不可能根据不同的手机分辨率设计一款应用。比如,一个100*100的图片,在400*800分辨率的屏幕上显示和在1920*1080屏幕上显示肯定是不一样的,在400*800上显示比较大,而在1920*1080上则比较小了,为什么?这点非常简单,因为400*800点屏幕的像素密度比1920*1080的小太多了,以至于显示100*100的图片占用的长度要变大,而1920*1080就占用一点空间,这样显示就没有不好。所以android引入了一个新的单位dp。设想,100*100的图片在400*800的屏幕上显示时,可以让他缩小一点,不占用100*100像素这么大,而在1920*1080上时,把他放大一点,比如放大到200*200,来显示,尽可能的大到在不同的屏幕上,显示的屏幕长度时一样的。那怎么计算dp呢?

android中为了给计算dp设置了一个参考值,就是1px=160ppi,也就是1px表示160个像素点,这样我们来计算 dp/px=ppi/160;所以dp=(ppi/160)*px。这样子我们就得到了pxdp的转换。

对于上面的手机屏幕分辨率是1920*10804.96英寸,此时1dp=?px ?这个问题就很简单了。


结果:

2.0

所以此时dp/px=2.0.换句话来说1dp=2.0px。这样就可以达到不同分辨率的屏幕显示同一个界面显示一样的效果。想想,我们在设计界面时,使用dp作为单位,假如分辨率低的手机显示这个界面,这时候1dp=0.75px,如果分辨率高的手机显示这个界面,此时1dp=2.0px,两个手机显示的界面是一样的,相同控件在手机上显示的长度是一样的,分辨率低的用了少量像素点,分辨率高的用了大量像素点。

此时就可以满足不同的手机屏幕了。



DP(Dynamic Programming)是一种常用的优化算法,可以用来求解具有重叠子问题和最优子结构性质的问题。在Matlab中,可以使用以下步骤来实现DP计算: 1. 定义状态:确定问题的状态表示方法,通常用一个数组或矩阵来表示。 2. 定义状态转移方程:根据问题的最优子结构性质,定义状态之间的转移关系,通常用一个递推式来表示。 3. 初始化状态:确定初始状态的值,通常是将数组或矩阵的某些元素赋初值。 4. 计算最终状态:根据状态转移方程和初始状态,计算出最终状态的值。 5. 输出结果:根据最终状态的值,输出问题的解。 下面是一个简单的背包问题的DP计算示例: 假设有一个容量为C的背包,和n个物品,每个物品有一个重量w和一个价值v,要求在不超过背包容量的情况下,选择一些物品放入背包中,使得背包中物品的总价值最大。 1. 定义状态:设dp(i,j)表示前i个物品放入容量为j的背包中所能得到的最大价值。 2. 定义状态转移方程:dp(i,j) = max(dp(i-1,j), dp(i-1,j-w(i))+v(i)),其中w(i)和v(i)分别表示第i个物品的重量和价值。 3. 初始化状态:dp(0,j) = dp(i,0) = 0,表示不选取任何物品或背包容量为0时的最大价值为0。 4. 计算最终状态:根据状态转移方程和初始状态,计算dp(n,C)的值。 5. 输出结果:dp(n,C)即为问题的解,表示在容量为C的背包中选取n个物品所能得到的最大价值。 下面是一个使用Matlab实现DP计算的示例代码: function [max_value, selected_items] = knapsack_dp(C, w, v) % C: 背包容量,w: 物品重量,v: 物品价值 n = length(w); dp = zeros(n+1, C+1); for i = 1:n for j = 1:C if j < w(i) dp(i+1,j+1) = dp(i,j+1); else dp(i+1,j+1) = max(dp(i,j+1), dp(i,j-w(i))+v(i)); end end end max_value = dp(n+1,C+1); selected_items = zeros(1,n); j = C; for i = n:-1:1 if dp(i+1,j+1) > dp(i,j+1) selected_items(i) = 1; j = j - w(i); end end end 使用示例: C = 10; w = [2 3 4 5]; v = [3 4 5 6]; [max_value, selected_items] = knapsack_dp(C, w, v); fprintf('背包容量:%d\n', C); fprintf('物品重量:%s\n', mat2str(w)); fprintf('物品价值:%s\n', mat2str(v)); fprintf('最大价值:%d\n', max_value); fprintf('选取的物品:%s\n', mat2str(selected_items)); 输出结果: 背包容量:10 物品重量:[2 3 4 5] 物品价值:[3 4 5 6] 最大价值:11 选取的物品:[0 1 1 1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值