获取父布局的宽度

12
Android Studio 2.0 beta 6

我正在尝试使用ViewPropertyAnimator来移动Toolbar内的ImageView(ivSettings),使其距离右侧和顶部各20dp,从当前位置开始。并将ImageView (ivSearch) 移动到左侧和上侧20dp处。

这些ImageViews包含在Toolbar中。

这是初始状态,我想将图标移动到工具栏内的上角。

enter image description here

我正在使用以下代码获取宽度,然后减去一个值使ivSettings离右侧20dp。

final DisplayMetrics displayMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
final float widthPx = displayMetrics.widthPixels;

ivSearch.animate()
    .setInterpolator(new AccelerateInterpolator())
    .x(20)
    .y(20)
    .setDuration(250)
    .start();

ivSettings.animate()
    .setInterpolator(new AccelerateInterpolator())
    .x(widthPx - 160)
    .y(20)
    .setDuration(250)
    .start();

然而,我在不同的屏幕尺寸上尝试了这个方法,但无法得到精确的宽度计算。是否有更好的方法可以做到这一点?

非常感谢任何建议。


尝试使用工具栏中的宽度选项。 - Piyush
我已将宽度设置为“match_parent”,因此toolbar.getWidth()始终会返回0。 - ant2009
你是在onCreate()方法中调用这段代码获取宽度的吗? - Ajinkya
@Ajinkya,该代码在按钮单击事件中调用,在片段的onCreateView()方法中。 - ant2009
@Piyush,widthPx - 160,那只是我尝试不同值的结果,我并没有试图转换任何东西。 - ant2009
显示剩余5条评论
2个回答

7
您可以使用translationXtranslationY属性来实现您想要的效果。这些属性作为视图原始X和Y坐标的偏移量。
实际上,当正值时,translationX将使视图向右移动,当负值时则向左移动。同样地,当正值时,translationY将使视图向下移动,当负值时则向上移动。
针对您的问题,我假设您希望搜索图标最终到达左上角,设置图标到达右上角,并且每个视图都没有填充。
对于搜索图标,建议您首先将其放置在工具栏的左上角。然后将translationX和translationY两者都设置为20dp。这应该将搜索图标放置在与您的图像相同的位置。要将搜索图标移动到左上角,只需将translationX和Y从20dp动画到0dp即可。
对于设置图标,重复相同的步骤,但将translationX设置为-20dp,将translationY设置为20dp。这样它将被放置在与您的图像相同的位置。将两个值都动画到0以获得您想要的动画效果。
以下是参考动画代码。
ivSearch.animate()
    .setInterpolator(new AccelerateInterpolator())
    .translationX(0) // Takes value in pixels. From 20dp to 0dp
    .translationY(0) // Takes value in pixels. From 20dp to 0dp
    .setDuration(250)
    .start();

ivSettings.animate()
    .setInterpolator(new AccelerateInterpolator())
    .translationX(0) // Takes value in pixels. From -20dp to 0dp
    .translationY(0) // Takes value in pixels. From 20dp to 0dp
    .setDuration(250)
    .start();

// To get pixels from dp
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());

这种方法的好处在于,您不再需要知道父元素的尺寸。您只需要关心通过 translationX translationY 指定的偏移量即可。


5
我认为问题在于Animator方法期望的值是原始像素值。看起来代码只能在中密度屏幕上按您的意图工作。例如,高密度屏幕需要30px而不是20px才能位于相同的位置。在更高密度的屏幕上,现有代码会将图标推向边缘...
这意味着我们需要将预期的dp值转换为原始像素值,并将其用于动画。有一个方便的方法可以将dp转换为px,使其在每个设备上都正确。我假设您希望齿轮的左侧距离右侧160dp(请注意,我特别指出齿轮的左侧,因为160dp的值还应该包括齿轮图像的宽度,因为x属性是从图像左侧开始)。因此,160dp = 齿轮图像宽度 + 所需右侧边距距离。 假设您有一个名为ic_gear的资源: Drawable drawable = getResources().getDrawable(R.drawable.ic_gear); float bitmapWidth = getIntrinsicWidth();
float rawPX20DPValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());

float rawPXLeftOffset = rawPX20DPValue + bitmapWidth;

ivSearch.animate()
    .setInterpolator(new AccelerateInterpolator())
    .x(rawPX20DPValue)
    .y(rawPX20DPValue)
    .setDuration(250)
    .start();


ivSettings.animate()
    .setInterpolator(new AccelerateInterpolator())
    .x(widthPx - rawPXLeftOffset)
    .y(rawPX20DPValue)
    .setDuration(250)
    .start();

动手之前,确保检查齿轮和搜索图标的偏移(填充)是否正确,因为这可能会影响最终结果。


160这个值只是我随便玩玩的。我的目标是让两张图片都动起来,左边的图片距离工具栏左边缘20dp,右边的图片距离工具栏右边缘20dp。对于右边的那张图片,我想计算工具栏的总宽度,然后减去一个值,使其距离右边缘20dp。希望你现在更明白了。谢谢。 - ant2009
@ant2009 我已经更新了代码,给出了计算图像大小的方法。请注意,如果你在ImageView上设置了padding,你需要将其加入到计算中。如果还需要进一步帮助,请告诉我 :) - Jim Baca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接