【问题标题】:How to scale a layout to a specific size (not relative size) in android using ScaleAnimation?如何使用 ScaleAnimation 在 android 中将布局缩放到特定大小(不是相对大小)?
【发布时间】:2017-07-17 00:23:23
【问题描述】:

我的 activity_main.xml 布局中有一个 RelativeLayout。我已将其 widthheight 分别定义为 250dp48dp如下图所示xml sn-p

现在我想动画(缩放)它的宽度从那个值(默认)到48dp,(枢轴应该是右边缘) .我曾尝试使用 ScaleAnimation、ValueAnimation、ObjectAnimation 来做到这一点,但它们似乎适用于相对值

如果可能的话,我想使用 ScaleAnimation 来做到这一点。

这是我的相对布局:

<RelativeLayout
    android:layout_width="250dp"
    android:layout_height="48dp"
    android:id="@+id/layout_1"
    android:layout_below="@id/default_layout"
    android:layout_centerHorizontal="true"
    android:background="@drawable/round_corner_layout_1">


        ...


</RelativeLayout>

这是我的 scaleAnimate 方法:

private void scaleAnimate(long startOffSet, int fromX, int fromY, int toX, int toY, int pivotTypeX, int pivotTypeY, float pivotX, float pivotY, int duration, Interpolator interpolator, final View... v){

    Animation animation = new ScaleAnimation(fromX, toX, fromY, toY, pivotTypeX, pivotX, pivotTypeY, pivotY);
    animation.setDuration(duration);
    animation.setFillAfter(true);
    animation.setInterpolator(interpolator);
    animation.setStartOffset(startOffSet);

    for(View view : v){
        view.setVisibility(View.VISIBLE);
        view.startAnimation(animation);
    }
}

编辑:

这就是我想要动画布局的方式。我尝试创建一个图像,链接在下面,以解释我正在尝试做的事情。

Layout Scaling Interpretation

布局中的视图将 alpha 设置为 0。(我可以完美地设置 alpha 动画。没有问题 :D)。左边是缩放前的布局,右边是缩放后的布局。缩放后,圆角应形成一个圆圈。这就是为什么高度和宽度都需要相同(48dp)的原因。左(上和下)两个角都向右(上和下)两个角移动。右边缘将保持静止。右边缘是枢轴。

为了支持不同分辨率的设备,初始宽高可以改为wrap_content。不用担心。但是动画布局后,高度和宽度需要相同,才能形成一个圆圈。

【问题讨论】:

  • 为什么需要使用特定尺寸? Android 支持超过 10,000 种具有多种屏幕尺寸的设备!!!
  • 我已经编辑了问题。我试图解释我到底想要做什么:)

标签: android android-layout


【解决方案1】:

缩放属性通过乘以原始大小来影响视图的大小,因此它们不适合动画到绝对大小,正如您所发现的那样。

改为使用ValueAnimatorAnimatorUpdateListener 来设置视图的宽度。

ValueAnimator anim = ValueAnimator.ofInt(v.getMeasuredWidth(), END_WIDTH);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        ViewGroup.LayoutParams params = v.getLayoutParams();
        params.width = (int) animator.getAnimatedValue();
        v.setLayoutParams(params);
    }
});
...
anim.start(); 

【讨论】:

  • 我已经编辑了问题,以便能够解释我到底想要做什么。希望在那之后我的查询会很清楚:)
  • 即使在编辑之后,我相信我上面的答案就是你想要的。
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2011-08-12
  • 2019-05-18
相关资源
最近更新 更多