获取父布局的宽度

时间:2016-03-08 16:19:00

标签: android animation viewpropertyanimator

Android Studio 2.0 beta 6

我正在尝试使用ViewPropertyAnimator在工具栏中移动ImageView (ivSettings),使其从右侧20dp,从顶部20dp,从当前位置开始。并从左侧和顶部移动ImageView (ivSearch) 20dp。

imageView包含在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();

然而,在不同的屏幕尺寸上尝试过此操作后,我无法获得精确的宽度计算。有没有更好的方法呢?

非常感谢任何建议

2 个答案:

答案 0 :(得分:7)

您应该能够使用translationXtranslationY属性来达到您想要的效果。这些属性充当视图的原始X和Y坐标的偏移。

基本上,translationX会将一个View向右移动一个正值,并从它的X坐标中取一个负值。类似地,translationY将View替换为底部的正面,顶部取代它的Y坐标的负值。

回到你的问题,我假设您想要到达的最终位置是搜索图标的左上角,而设置图标的右上角是每个视图的零填充。

对于搜索图标,我建议您先将其放在工具栏的左上角。然后将translationX和translationY都设置为20p。这应该将搜索图标放在与图像相同的位置。要将搜索图标移到左上角,您只需动画翻译X& Y从20dp到0 dp。

对设置图标重复相同操作,但将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());

这种方法的好处在于您不再需要知道父级的维度。您关注的是您通过translationXtranslationY指定的偏移量。

答案 1 :(得分:5)

我认为问题在于Animator方法期望值是原始像素值。看起来代码只能在中密度屏幕上运行。例如。 hdpi屏幕需要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();

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