2

こんにちは私はAndroidでビューの高さをアニメーション化しようとしています5秒ごとに言います:-

  1. 高さは0から5になります
  2. 高さは5から10になります
  3. 高さは10から3などになります

私は以下のコードを使用しています:-

    public class ShowAnimation extends Animation{
    float finalHeight;
    View imageview;

    public ShowAnimation(View view,float deltaheight){
        this.imageview=view;
        this.finalHeight=deltaheight;
    }

    protected void applyTransformation(float interpolatedtime,Transformation t){
        imageview.getLayoutParams().height=(int)(finalHeight*interpolatedtime);
        imageview.requestLayout();
    }
    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
    }

次のように初期化します:-

Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
delta.startAnimation(anidelta);

しかし、これで私は以下を得る:-

  1. 高さは0から5になります
  2. 高さは0から10になります
  3. 高さは0から3になります

高さを毎回0からではなく、前の高さからアニメーション化する必要があります。誰かがここで私を助けてくれますか

編集1:-私はこれをしました

Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
anidelta.setFillAfter(true);
delta.startAnimation(anidelta);

ただし、それでも0からnewheightまでアニメートします。

4

4 に答える 4

7

さて、これが私が最終的にそれを解決した方法です:-

    public class ResizeAnimation extends Animation 
{
   View view;
int startH;
int endH;
int diff;

public ResizeAnimation(View v, int newh)
{
    view = v;
    startH = v.getLayoutParams().height;
    endH = newh;
    diff = endH - startH;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) 
{
    view.getLayoutParams().height = startH + (int)(diff*interpolatedTime);
    view.requestLayout();
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) 
{
    super.initialize(width, height, parentWidth, parentHeight);
}

@Override
public boolean willChangeBounds() 
{
    return true;
}}
于 2012-12-08T17:24:44.403 に答える
1

この投稿が1年以上アクティブになっていないことは知っていますが、とにかくビューの高さをアニメーション化する最も簡単な方法だと思うものを投稿します。

Animationクラスを宣言する代わりに、APIレベル11から利用可能なView.setScaleYAPIを使用できます。

これを使用して、希望の秒で0-1(0は高さがないことを意味し、1は元の高さを意味する)の範囲内で拡大縮小するビューを指定できます。

XMLでは、ビューの高さを最大の高さに設定します。次に、ビューを膨らませるときに(Activity#onCreate()またはFragment#onViewCreated()など)、次のことができます。

yourView.setScaleY(0);

その後、5秒後に設定できます

yourView.setScaleY(0.5f);

これにより、ビューの高さが即座にスケーリングされます。アニメーションでビューを拡大縮小する場合は、たとえば次のようにすることができます。

yourView.animate().scaleY(0.5f).setDuration(200).start();

お役に立てば幸いです。

于 2017-11-23T07:53:50.690 に答える
0

applyTransformationビューの高さを増やすか減らすかをメソッドに伝えるために、追加のフラグが必要です。

コンストラクターにフラグを追加し、そのフラグをインスタンス変数として保存し、そのフラグを使用して、ビューの高さを増やすか減らすかを決定します。

public class ShowAnimation {
    // other instance variables
    private boolean increaseHeight;

    public ShowAnimation(View view, float deltaheight, boolean increaseHeight) {
        // other initializations
        this.increaseHeight = increaseHeight;
    }

    protected void applyTransformation(float interpolatedTime, Transformation t) {
        if (increaseHeight)
            imageview.getLayoutParams().height = (int) (finalHeight * interpolatedTime);
        else {
            imageview.getLayoutParams().height = (int) (finalHeight * (1 - interpolatedTime));
        }
        imageview.requestLayout();
    }

}
于 2012-12-07T05:16:50.437 に答える
-2

アニメーションセットをお試しください。これがあなたの望むものかどうかはわかりません。

アニメーション1for:高さは0から5になります
アニメーション2 for:高さは0から10になります
アニメーション3 for:高さは0から3になります

public void applyAnimation(ImageView ivDH) {
    System.out.println("Inside applyAnimation()");
    scaleAnim1 = new ScaleAnimation(0, 5, 0, 5);
    scaleAnim1.setDuration(5000);
    scaleAnim1.setRepeatCount(0);
    scaleAnim1.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim1.setFillAfter(true);

    scaleAnim2 = new ScaleAnimation(-5, 10, -5, 10);
    scaleAnim2.setDuration(5000);
    scaleAnim2.setRepeatCount(0);
    scaleAnim2.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim2.setFillAfter(true);

    scaleAnim3 = new ScaleAnimation(10, 3, 10, 3);
    scaleAnim3.setDuration(5000);
    scaleAnim3.setRepeatCount(0);
    scaleAnim3.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim3.setFillAfter(true);

    AnimationSet animationSet = new AnimationSet(true);
    animationSet.addAnimation(scaleAnim1);
    animationSet.addAnimation(scaleAnim2);
    animationSet.addAnimation(scaleAnim3);
    animationSet.setDuration(15000);
    animationSet.setFillAfter(true);

    ivDH.clearAnimation();
    ivDH.startAnimation(animationSet);
}
于 2012-12-07T05:59:43.813 に答える