ant*_*009 12 animation android viewpropertyanimator
Android Studio 2.0 beta 6
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用ViewPropertyAnimator移动ImageView (ivSettings)
工具栏内部,使其从右侧20dp,从顶部20dp,从当前位置.并ImageView (ivSearch)
从左侧和顶部移动20dp.
imageViews包含在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();
Run Code Online (Sandbox Code Playgroud)
但是,在不同的屏幕尺寸上试过这个,我无法得到精确的宽度计算.有没有更好的方法呢?
非常感谢任何建议
您应该能够使用translationX
和translationY
属性来实现您想要的效果.这些属性充当视图的原始X和Y坐标的偏移.
基本上,translationX将向右移动一个View以获得正值,并从其X坐标向左移动一个负值.类似地,translationY将视图向底部移位为正向,顶部为负值从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());
Run Code Online (Sandbox Code Playgroud)
这种方法的好处在于您不再需要知道父级的维度.您所关心的只是您通过translationX
和指定的偏移量translationY
.
我相信问题是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();
Run Code Online (Sandbox Code Playgroud)
在移动之前还要检查齿轮的偏移(填充)和搜索图标,因为这可能也会影响最终结果.
归档时间: |
|
查看次数: |
671 次 |
最近记录: |