ScaleAnimation(プログラムではxmlにない)を使用して、表示する高さを親の高さの0〜60%に変更します。ビューの幅は一定で、50pxです。ビューは空で、背景色のみが設定されています。
誰かがコードからScaleAnimationを使用してscaleAnim
のコードをくれますか。
<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(...);
アニメーションの前後を見る。ありがとう
これを正確に行うためのコードの一部を次に示します。
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つの引数を取ります。4つの引数は、(1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...)
を気にしないXスケールの処理に関連しています。
他の4つの引数は、気にするYスケーリング用です。
startScale, endScale
-あなたの場合、0f, 0.6f
を使用します。
Animation.RELATIVE_TO_SELF, 1f
-これは、ビューの縮小が折りたたまれる場所を指定します(ドキュメントではピボットと呼ばれます)。ここでは、アニメーションの下部からバーの成長を開始するため、float値を1f
に設定します。上から下に向かって成長させたい場合は、0f
を使用します。
最後に、同様に重要なのは、anim.setFillAfter(true)
の呼び出しです。アニメーションの完了後にアニメーションの結果を保持したい場合は、アニメーションを実行する前にアニメーターでこれを実行する必要があります。
あなたの場合、次のようなことができます:
View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
このコードを試して、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);
この方法を使用してください
必要な場合scale to quarter(half x、half y)
view.animate().scaleX(0.5f).scaleY(0.5f)
scaleが必要で、右下に移動する場合
view.animate().scaleX(0.5f).scaleY(0.5f)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())
topに移動する場合は(-view.height/4)
を使用し、left(-view.width/4)には
何かしたい場合アニメーションの終了後withEndAction(Runnable runnable)
関数を使用します。
alphaやrotationのような他のプロパティを使用できます
完全なコード
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
}
});
ヘルパーメソッドおよびstart-repeat-endハンドラーを使用して、次のようにサイズを変更します。
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);
}