如何缩小视图并将视图滑入左上角?

时间:2015-12-28 18:31:07

标签: android android-animation android-view

我有一个布局资源文件:

<?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()上使用thumbnailx()并注释掉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

我不理解为什么需要这些计算。 IOW,为什么y{"error":{"errors":[{"domain":"global","reason":"lockedDomainExpired","message":"Locked Domain Expired"}],"code":401,"message":"Locked Domain Expired"}} 取决于规模?

1 个答案:

答案 0 :(得分:4)

设置scale(使用setScale或通过动画设置)时,会考虑pivot个值。默认值pivotXpivotY分别是width的一半和height的一半(分别)。因此,当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); (纵向和横向)移动。

如果您尝试以下代码,您将看到一切都按预期工作。

sass --watch style.scss:path/to/file1.css style.scss:path/to/file2.css