观看 Android 缩放动画

我想使用 ScaleAnimation (不在 xml 中编程)将高度更改为查看从0到60% 的父高度。视图宽度为常数,为50px。视图为空,只设置了背景颜色。

有人能给我的代码 scaleAnim使用 ScaleAnimation 从代码。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layContainer
>
<View
android:layout_width="50px"
android:layout_height="fill_parent"
android:id="@+id/viewContainer"
android:background:"#00f00"
/>


</LinearLayout>




ScaleAnimation scaleAnim = new ScaleAnimation(...);

view before and after animation

动画前后视图 。谢谢

182181 次浏览

尝试不使用 xml 创建 Scale 动画

ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

在 XML 中,我用这个来达到同样的结果。也许这个更直观。

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >


<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="1.0"
android:toYScale="1.0" />


</set>

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >


<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="1.0"
android:toYScale="0.0" />


</set>

看 X 轴上的动画是从 1.0 -> 1.0,这意味着你没有任何放大的方向,并保持在全宽,而在 Y 轴上,你得到 0.0 -> 1.0放大,如问题中的图形所示。希望这对谁有帮助。

有些人可能想知道 Java 代码,因为我们看到一个请求。

将动画文件放置在 anim文件夹中,然后加载并设置动画文件。

Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down);
ImagView v = findViewById(R.id.your_image_view);
v.startAnimation(scaleDown);

这里有一个代码片段可以完全做到这一点。

public void scaleView(View v, float startScale, float endScale) {
Animation anim = new ScaleAnimation(
1f, 1f, // Start and end values for the X axis scaling
startScale, endScale, // Start and end values for the Y axis scaling
Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling
anim.setFillAfter(true); // Needed to keep the result of the animation
anim.setDuration(1000);
v.startAnimation(anim);
}

这里使用的 ScaleAnimation 构造函数有8个 args,4个与处理 X-scale 有关,我们不关心 (1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...)

另外4个参数用于我们关心的 Y 缩放。

在你的情况下,你会使用 0f, 0.6f

Animation.RELATIVE_TO_SELF, 1f-指定视图收缩到哪里(在文档中称为轴心)。在这里,我们将浮点值设置为 1f,因为我们希望动画从底部开始生长条形图。如果我们想让它从顶部向下生长,我们会使用 0f

最后,同样重要的是对 anim.setFillAfter(true)的调用。如果希望动画结果在动画完成后仍然存在,则必须在执行动画之前在动画工具上运行此操作。

所以在你的情况下,你可以这样做:

View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);

使用 辅助方法开始-重复-结束处理程序调整大小,如下所示:

resize(
view1,
1.0f,
0.0f,
1.0f,
0.0f,
0.0f,
0.0f,
150,
null,
null,
null);


return null;
}

助手方法:

/**
* Resize a view.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration) {


resize(
view,
fromX,
toX,
fromY,
toY,
pivotX,
pivotY,
duration,
null,
null,
null);
}


/**
* Resize a view with handlers.
*
* @param view     A view to resize.
* @param fromX    X scale at start.
* @param toX      X scale at end.
* @param fromY    Y scale at start.
* @param toY      Y scale at end.
* @param pivotX   Rotate angle at start.
* @param pivotY   Rotate angle at end.
* @param duration Animation duration.
* @param start    Actions on animation start. Otherwise NULL.
* @param repeat   Actions on animation repeat. Otherwise NULL.
* @param end      Actions on animation end. Otherwise NULL.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration,
Callable start,
Callable repeat,
Callable end) {


Animation animation;


animation =
new ScaleAnimation(
fromX,
toX,
fromY,
toY,
Animation.RELATIVE_TO_SELF,
pivotX,
Animation.RELATIVE_TO_SELF,
pivotY);


animation.setDuration(
duration);


animation.setInterpolator(
new AccelerateDecelerateInterpolator());


animation.setFillAfter(true);


view.startAnimation(
animation);


animation.setAnimationListener(new AnimationListener() {


@Override
public void onAnimationStart(Animation animation) {


if (start != null) {
try {


start.call();


} catch (Exception e) {
e.printStackTrace();
}
}


}


@Override
public void onAnimationEnd(Animation animation) {


if (end != null) {
try {


end.call();


} catch (Exception e) {
e.printStackTrace();
}
}
}


@Override
public void onAnimationRepeat(
Animation animation) {


if (repeat != null) {
try {


repeat.call();


} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public void expand(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {


}


@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.INVISIBLE);
}


@Override
public void onAnimationRepeat(Animation animation) {


}
});
v.startAnimation(scaleAnimation);
}


public void collapse(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {


}


@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.VISIBLE);
}


@Override
public void onAnimationRepeat(Animation animation) {


}
});
v.startAnimation(scaleAnimation);
}

使用此方法(不需要 xml 文件)

如果你想让 规模变成四分之一(半 x,半 y)

view.animate().scaleX(0.5f).scaleY(0.5f)

如果你想要 规模移动到右下角

view.animate().scaleX(0.5f).scaleY(0.5f)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())

如果你想移动到 头儿使用 (-view.height/4)左边(- view.width/4)

如果你想做一些事情 在动画结束之后使用 withEndAction(Runnable runnable)函数。

您可以使用其他一些属性,如 阿尔法轮换

全密码

view.animate()
.scaleX(0.5f).scaleY(0.5f)//scale to quarter(half x,half y)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())// move to bottom / right
.alpha(0.5f) // make it less visible
.rotation(360f) // one round turns
.setDuration(1000) // all take 1 seconds
.withEndAction(new Runnable() {
@Override
public void run() {
//animation ended
}
});

在值 anim 上添加此代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">


<scale
android:duration="@android:integer/config_longAnimTime"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"/>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set>

调用 styles.xml

<style name="DialogScale">
<item name="android:windowEnterAnimation">@anim/scale_in</item>
<item name="android:windowExitAnimation">@anim/scale_out</item>
</style>

在 Java 代码中: 设置 Onclick

public void onClick(View v) {
fab_onclick(R.style.DialogScale, "Scale" ,(Activity) context,getWindow().getDecorView().getRootView());
//  Dialogs.fab_onclick(R.style.DialogScale, "Scale");


}

设置方法:

alertDialog.getWindow().getAttributes().windowAnimations = type;