【问题标题】:Strange behaviour when adding and animating imageViews in android在android中添加和动画imageView时的奇怪行为
【发布时间】:2016-04-26 13:53:21
【问题描述】:

我有一个带有背景位图的 LinearLayout。我正在使用动画向此布局添加 2-3 张图像。问题是:每次我添加图像时,第一个图像动画从左上角开始,对于该动画之后的所有其他图像,它从中心开始工作得很好。我苦苦挣扎了好几天,为这个烦人的小问题找到解决方案。你有什么建议会导致这种情况吗?

这是我制作的 gif 中的问题:http://imgur.com/FCPgof1

我的动画:`

<scale
    android:duration="750"
    android:fillAfter="false"
    android:fromXScale="0"
    android:fromYScale="0.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1.0"
    android:toYScale="1.0" />

`

我的布局:

<LinearLayout
   android:id="@+id/layoutCompareUppoints"
   android:layout_width="140dp"
   android:layout_height="28dp"
   android:background="@drawable/uppballsbgnew" >
</LinearLayout>

我的代码: `private void animUppointsBefore() {

    if (k < Integer.valueOf(uppoints)) {

        Animation a = AnimationUtils.loadAnimation(this,
                R.anim.debug_grow_fast_animation);


    ImageView upp = new ImageView(this);
    upp.setImageResource(R.drawable.uppballlightnew);
    upp.setAdjustViewBounds(true);
    uppLayout.addView(upp);
    upp.startAnimation(a);
    a.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation a) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation a) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation a) {
            // TODO Auto-generated method stub

            k++;
            animUppointsBefore();

        }
    });

    }

}`

【问题讨论】:

  • 在 Q 中添加代码会有所帮助
  • 我添加了我的动画代码。但是我想再说一遍,在我添加第一个图像后,我的代码对每个图像都运行良好。这让人很难理解
  • 你试过RelativeLayout吗?我知道 LinearLayout 对免费图像操作不太友好
  • 还没有,我希望我的图像显示在之前添加的图像旁边,这就是为什么使用线性布局
  • 与 relativeLayout 的行为相同 :(

标签: android animation imageview pivot center


【解决方案1】:

您最有可能看到的问题是图像在任何动画实际发生之前就被添加到布局中。图像将从全尺寸开始,缩小到 0,然后放大到 1。

您要做的是在添加之前使其不可见,然后使其显示在屏幕外。有几种方法,通常的方法是将ImageView 设置为View#INVISIBLE,然后使用Animation#AnimationListener,在动画开始时将视图设置为View#VISIBLE

如果可以,使用Animators 会更容易(支持库中的一些库不允许这样做)。您可以在添加视图之前将其 Alpha 设置为 0,然后作为动画的一部分立即将其设置为 1。只需制作两个 ObjectAnimators,一个用于 alpha,一个用于缩放,然后将它们组合成一个 AnimatorSet

编辑:

把来自 cmets 的最终答案放到这里。

与其在制作动画之前添加视图,不如将已经在布局中布局但不可见的图像视图放置起来可能会有所帮助。这样一来,就不需要新的布局和测量通道,这可能会使测量结果与枢轴点发生冲突。

【讨论】:

  • 感谢您的详细解答!不幸的是,这并不能帮助我解决问题。我为我的动画中发生的事情制作了一个 gif 图像。如果您花时间看一下,我将不胜感激。 imgur.com/FCPgof1
  • 哦,这很有趣。看起来枢轴点位于 0%,0% 角上。我不确定是什么导致了我的脑海中出现这种情况,但您可以尝试的一件事是保持图像全部布局但不可见。这样,它们的整体布局始终存在,无需重新测量(添加视图时会发生这种情况)。实际上现在我想起来了,pivot 可能会被计算为 0,0,因为此时 ImageViews 没有宽度或高度。
  • 是的,这可能是我的问题的一个有效解决方案,尽管重写除了那个愚蠢的第一张图片之外基本上可以工作的代码有点令人沮丧:D 但是非常感谢你花时间,我我想我会按照你提议的方式尝试一下。
  • 感谢老兄终于成功了!!虽然我对我的问题没有任何解释,但最好以更简单的方式进行。
猜你喜欢
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多