我有两个用户可以在屏幕上移动的图像视图:
<ImageView
android:layout_width="35dp"
android:layout_height="match_parent"
android:id="@+id/leftRulerView"/>
<ImageView
android:layout_width="35dp"
android:layout_height="match_parent"
android:id="@+id/rightRulerView"/>
按以下方式初始化:
mLeftRuler = (ImageView) view.findViewById(R.id.leftRulerView);
mRightRuler = (ImageView) view.findViewById(R.id.rightRulerView);
当两者都在移动时,我正在计算两个视图之间的实际物理距离(这将用于测量真实世界的物体)。 rightRulerView
始终位于左侧的右侧,因此它们之间的距离是从最左侧视图的右边缘到右侧视图的左边缘。请参阅下图:
首先,两个视图的像素分离:
float distance = mRightRuler.getX() - (mLeftRuler.getX() + mLeftRuler.getWidth());
这是因为getX()
返回视图左侧的x位置。我对右标尺的左侧感兴趣,但我需要添加左标尺的宽度以获得右侧标尺的位置。然后,只需减去两者之间的像素数。这很好用,可以很好地提供视图之间的像素数。
要将其转换为英寸,我会执行以下操作:
DisplayMetrics mDisplayMetrics = getResources().getDisplayMetrics();
float mDPI = (float) mDisplayMetrics.densityDpi;
float measurement = distance / mDPI;
这一切相当不错,但它并不完美。什么时候说&#34; 1.00英寸&#34;在两个视图之间,它实际上只有不到1 1/8英寸(用物理屏幕上的标尺测量)。不准确性传播到更远的距离(即&#34; 3.00英寸&#34;在应用程序中实际测量到超过3 1/4英寸,屏幕上有标尺)。
那里有标尺应用程序,它们对于真实世界的标尺是准确的,那么如何将两个视图之间的像素距离转换为准确的测量?
提前谢谢。
答案 0 :(得分:2)
据我所知,至少没有办法在没有任何用户输入的情况下获得精确的物理尺寸。我所做的是制作一个弹出窗口,用户必须输入直径,然后使用一些7年级的数学,并获得屏幕边缘的物理尺寸,假设它们是正方形。然后你就像“0.1mm /像素”一样,然后你可以继续使用你的方法。
答案 1 :(得分:1)
在DisplayMetrics中,您可以使用
mDisplayMetrics.xdpi
X维度中每英寸屏幕的确切物理像素数。
mDisplayMetrics.ydpi
Y维度中每英寸屏幕的确切物理像素。
然后你可以做一些简单的数学运算来获得真正的距离
答案 2 :(得分:0)
在API 17中引入了getRealMetrics()
。它应该在xdpi
和ydpi
中为您提供准确的值。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
但是,如果您需要支持较低的API版本,则无法在没有用户输入和校准的情况下实现目标。