我有一个布局资源文件:

<?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>

在某个时间点,此布局将显示在我的活动中。在这一点上,我将把thumbnailImageView的可见性设置为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);

我不明白的是为什么需要这些计算。瞧,为什么xy取决于刻度?

最佳答案

当设置scale时(使用setScale或通过动画),将考虑pivot值。pivotXpivotY的默认值分别是widthheight的一半。因此,当pivotsView时,默认View的任何缩放都将导致scale1.0f的中心(或朝向X的中心)缩放。
YtranslationX(以及translationYpivots)不受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);

android - 如何收缩并将 View 滑入左上角?-LMLPHP

08-05 08:19