我有一个布局资源文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- other widget here -->
<ImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFFFF"
android:layout_gravity="top|left"
android:visibility="gone"/>
</FrameLayout>
在某个时间点,此布局将显示在我的活动中。在这一点上,我将把
thumbnail
ImageView
的可见性设置为View.VISIBLE
,然后设置动画,使其占据屏幕宽度/高度的30%,位于左上角的marginPixels
(在我的测试设备上,marginPixels
是48)。这将暴露基础的View
,但thumbnail
接管的部分除外。为此,我有以下Java:
thumbnail.setVisibility(View.VISIBLE);
thumbnail
.animate()
.scaleX(0.3f)
.scaleY(0.3f)
.x(marginPixels)
.y(marginPixels)
.setDuration(animDuration);
结果是动画发生了,但是
thumbnail
位于FrameLayout
的中心。我试过:
在布局XML中的
android:layout_gravity="top|left"
上同时具有和不具有ImageView
。translationX(marginPixels)
/translationY(marginPixels)
而不是x(marginPixels)
/y(marginPixels)
translationXBy(marginPixels)
/translationYBy(marginPixels)
而不是x(marginPixels)
/y(marginPixels)
似乎都没有效果。
thumbnail
始终居中。如果我注释掉x()
和y()
调用,结果也会居中,这表明出于某种原因,它们被忽略了。相反,如果我注释掉scaleX()
和scaleY()
调用(保留x()
和y()
如原始列表所示),则thumbnail
将转换到正确的位置,但它仍然是全尺寸的。如果我在动画前对setX()
本身使用setY()
和thumbnail
并注释掉x()
和y()
调用,thumbnail
最初位于正确的位置,但是一旦缩放动画启动,我就回到中心。现在,我当然可以计算出正确的值来使用,给定屏幕大小等等。但似乎
x()
/y()
应该是在ViewPropertyAnimator
上使用的正确方法,所以我试图找出我的错误所在。更新:这段代码可以工作(或者至少可以接近-我还没有实际测量结果来确认精确的像素位置):
int x=(int)(-0.35f*(float)bmp.getWidth())+marginPixels;
int y=(int)(-0.35f*(float)bmp.getHeight())+marginPixels;
thumbnail.setVisibility(View.VISIBLE);
thumbnail.setImageBitmap(bmp);
thumbnail
.animate()
.x(x)
.y(y)
.scaleX(0.3f)
.scaleY(0.3f)
.setDuration(animDuration);
我不明白的是为什么需要这些计算。瞧,为什么
x
和y
取决于刻度? 最佳答案
当设置scale
时(使用setScale
或通过动画),将考虑pivot
值。pivotX
和pivotY
的默认值分别是width
和height
的一半。因此,当pivots
是View
时,默认View
的任何缩放都将导致scale
从1.0f
的中心(或朝向X
的中心)缩放。Y
和translationX
(以及translationY
和pivots
)不受thumbnail
的影响。您可以看到marginPixels
实际上被移动了(垂直和水平)。
如果您尝试下面的代码,您将看到一切都按预期工作。
thumbnail.setVisibility(View.VISIBLE);
thumbnail.setPivotX(0);
thumbnail.setPivotY(0);
thumbnail
.animate()
.scaleX(0.3f)
.scaleY(0.3f)
.x(marginPixels)
.y(marginPixels)
.setDuration(animDuration);