2016-05-06 20 views
2

我有一个主要问题,我现在正在工作数天。首先看需求是很容易理解的。我将在下面的表格中尽可能简单地列出我的要求。Android图形:绘制相同大小的圆圈

  1. 我有5个Android手机。 5种不同的品牌,不同的屏幕尺寸。
  2. 想象一下屏幕尺寸是4英寸,4.5英寸,5英寸,5.1英寸和5.2英寸
  3. 我有一个Android应用程序,它有一个绘图画布。
  4. 正在使用canvas.drawCircle(x/2, y/2, radius, paint)我正在画一个圆圈。想象一下半径是100(100像素?)
  5. 我在我最小的手机屏幕上安装了这个应用程序,4英寸。然后我用尺子测量圆的直径。想象一下圆的直径是“精确”3厘米。
  6. 现在我将其安装在其他手机中。
  7. 不幸的是,在我的4.5英寸手机中,圆的直径是3.2厘米。在5英寸的手机它是3.3厘米。在5.1英寸的手机,它是2.8厘米等。
  8. 但是我希望我的圆圈直径在每部手机中均为3厘米(确切3厘米)。

以上要求是我现在想要的几天。我尝试了以下措施以确保我在所有屏幕上都能看到没有大小变化的圆圈。

  1. 使用ImageView - 我试图使用ImageView并增加了一个圆的图像。我给了宽度,高度固定。我试着设置的值在px,dp,inches等我也试过scalling选项可用于ImageView。还尝试在drawable-nodpi文件夹中放置相同的图像。尝试创建所有尺寸的可绘制文件夹(例如:drawable-mdpi,drawable-hdpi)。这不会阻止缩放图像。
  2. 使用画布 - 如上所述,我尝试使用画布和绘制图像。绘图比例。
  3. 查找每英寸的像素数 .-尝试每英寸寻找每英寸的手机编程思维我可以找到一种方法来从它开发出一个逻辑动态地绘制相同大小的图像。我使用了几个链接,包括 - Calculate PPI of Android Device。他们中的大多数人都只谈论获得屏幕分辨率。

如何满足绘制相同大小圆圈的要求?如果可以通过了解PPI来完成,我该怎么做?

回答

0

也许这并不回答,而是可能会有所帮助

float _100MmAsPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
    100/*mm unit set*/, getResources().getDisplayMetrics()); 

上面给我1661.5354在Nexus 5X和1889.7638的Nexus 5(模拟器)。都具有全高清显示,但5有4.95英寸与5.2英寸的5倍。

这件100毫米是6年和1890年1662个像素5X上

+0

那么上面的代码是为了什么呢? –

+0

其变化的整数的数量为COMPLEX_UNIT_MM(毫米)到像素(总是)。 – snachmsm

+0

我的意思是每英寸像素数? –

0

的答案之前,为我的工作,但只要它没有你,我会尽量解释一下,我认为这将有助于。

我有一个密度为1(每英寸160像素)的设备,显示度量指标告诉我我有320 * 480像素,而且计算简单,我应该知道我的移动宽度和高度, :320/160 =宽度为2英寸,480/160 = 3。现在一切都很好,直到我得到了统治者并测量它,而惊喜是这样的:我有1.65 * 2.48英寸!!。

然后我注意到,有一种叫做每英寸的物理像素的屏幕,这是缓解对我来说,你可以得到这样的:

getResources().getDisplayMetrics().xdpi; //for width physical dpi 
getResources().getDisplayMetrics().ydpi; //for height physical dpi 

现在我可以计算出我的身体的宽度和高度我的设备是这样的:

我的宽度和高度物理dpi是193.5238所以...

320/193.5238 = 1.65英寸宽度 480/193.5238 = 2.48英寸高度

这是正确的!

现在回到你的问题让我们得到了3cm的任何电话像素:

越来越厘米宽度:以cm

宽度=宽度英寸* 2.54(因为1英寸等于2.54厘米)

获得在每个像素厘米的量:

宽度以像素为单位/宽度在每厘米厘米=像素宽度(PX /厘米)

ñ流要一个3厘米然后根据它的像素是:

3 *总数=3厘米像素

所有上述可缩短这样的:

float devicePixelsWidth = getResources().getDisplayMetrics().widthPixels; 
float deviceActualDpi = getResources().getDisplayMetrics().xdpi ; 
float deviceActualInchWidth = devicePixelsWidth/deviceActualDpi ; 
float deviceActualCMWidth = deviceActualInchWidth * 2.54f ; 

float PixelsForActual3CM = devicePixelsWidth/deviceActualCMWidth * 3; 

在结束时,所有的以上内容已经过我的测试和认可,并具有与之前Answer方法相同的准确度:)