我正在编写一个拖放应用程序,因为一些参数而感到非常困惑。
请帮忙搞清楚。
首先,我阅读了View类的文档,并得到了以下解释。
getX() : The visual x position of this view, in pixels.
getY() : The visual y position of this view, in pixels.
getWidth() : Return the width of the your view.
getHeight() : Return the width of the your view.
getTop() : Top position of this view relative to its parent.
getLeft() : Left position of this view relative to its parent.
现在,当我们完成官方文档时,让我们看看我们有什么。
我有一个原始大小500x500的图像叫做圆圈。
这是我的应用程序的实际屏幕截图
这是布局的xml
现在我关心的是什么。 当我看到我的当地人时,我得到以下内容,这让我很困惑。
我没有看到getX()和getY()函数有任何问题,因为它们实际上显示了图像开始的位置。
正如文档所述, getWidth()和getHeight方法返回视图的宽度和高度,但是监视窗口告诉我,我的getWidth()和getHeight是300,我真的无法理解,因为在我的XML中我每个都设置它们100dp,所以这些函数会在不同的测量中将它们返回给我,以及如何将其转换为dp。
最后,它告诉我getTop()和getLeft是700和300,正如文档所说,它们是图像相对于它的父级的位置。 但是我的父母不是线性布局,那么这个数字对于屏幕定位意味着什么呢?
所有这些测量方法都返回像素尺寸( px ),而不是密度像素( dp )。 如果你想转换它,你可以通过调用以获得密度:
float density = getResources().getDisplayMetrics().density;
然后将获得的值除以提供的密度,例如:
int widthDp = (int)(img.getWidth() / density);
您可以从dp获取像素
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics()); float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());
截至定位问题。 getTop和getLeft是相对值,基于您的父级。 由于ImageView的唯一父级是LinearLayout您可以将ImageView直接定位在ActionBar / ToolBar正下方
也不要使用图像作为圆形,你可以使用canvas.drawCircle轻松地绘制它,它需要更少的内存。