Android Studio 2.0 beta 6
我正在尝试使用ViewPropertyAnimator在工具栏中移动ImageView (ivSettings)
,使其从右侧20dp,从顶部20dp,从当前位置开始。并从左侧和顶部移动ImageView (ivSearch)
20dp。
imageView包含在Toolbar
。
这是初始状态,我想将图标移动到工具栏内的上角。
我正在使用的代码是获取宽度然后减去一个值以使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();
然而,在不同的屏幕尺寸上尝试过此操作后,我无法获得精确的宽度计算。有没有更好的方法呢?
非常感谢任何建议
答案 0 :(得分:7)
您应该能够使用translationX
和translationY
属性来达到您想要的效果。这些属性充当视图的原始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());
这种方法的好处在于您不再需要知道父级的维度。您关注的是您通过translationX
和translationY
指定的偏移量。
答案 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();
在移动前检查齿轮的偏移(填充)和搜索图标,因为这可能会影响最终结果。