14

私は自分の問題を非常に単純な表現に再現しました。私は3つのTextViewを持っています。そのうちの 2 つは別館LinearLayoutにあり、3 つ目は と同じ階にありLinearLayoutます。test1との可視性を切り替えていますがtest2、それらが消えていくのを見たいです (これはうまくいきます)。test3さらに、彼の新しい場所に滑り込みたい( と の代わりtest1test2)。私はこれを実現することはできません。test3新しいポイントにスナップするだけです。

どうすればこれを達成できますか?

私のコード:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click" />

    <LinearLayout android:animateLayoutChanges="true"
        android:id="@+id/child1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/test1"
            android:layout_width="match_parent" android:visibility="gone"
            android:layout_height="wrap_content"
            android:text="TEST1" />

        <TextView
            android:id="@+id/test2"
            android:layout_width="match_parent" android:visibility="gone"
            android:layout_height="wrap_content"
            android:text="TEST2" />
    </LinearLayout>

    <TextView
        android:id="@+id/test3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TEST3" />

</LinearLayout>

そして私の活動では:

public class LayoutAnimations extends Activity {
    private boolean toggle = true;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_animations);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (toggle) {
                    findViewById(R.id.test1).setVisibility(View.VISIBLE);
                    findViewById(R.id.test2).setVisibility(View.VISIBLE);
                } else {
                    findViewById(R.id.test1).setVisibility(View.GONE);
                    findViewById(R.id.test2).setVisibility(View.GONE);
                }
                toggle = !toggle;
            }
        });

    }

}

編集:私は実際には、常に表示されている必要があるandのTextView隣に別のものを持っているので、それ自体を非表示にすることはできません。test1test2LinearLayout

4

4 に答える 4

8

私は別の質問を使用してそれを解決しました。この答えを見る

引用:

最も簡単なアプローチは、Animationクラスを拡張し、オーバーライドapplyTransformation()してビューの高さを次のように変更することだと思います。

import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.LinearLayout;

public class MyCustomAnimation extends Animation {

    public final static int COLLAPSE = 1;
    public final static int EXPAND = 0;

    private View mView;
    private int mEndHeight;
    private int mType;
    private LinearLayout.LayoutParams mLayoutParams;

    public MyCustomAnimation(View view, int duration, int type) {

        setDuration(duration);
        mView = view;
        mEndHeight = mView.getHeight();
        mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams());
        mType = type;
        if(mType == EXPAND) {
            mLayoutParams.height = 0;
        } else {
            mLayoutParams.height = LayoutParams.WRAP_CONTENT;
        }
        view.setVisibility(View.VISIBLE);
    }

    public int getHeight(){
        return mView.getHeight();
    }

    public void setHeight(int height){
        mEndHeight = height;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {

        super.applyTransformation(interpolatedTime, t);
        if (interpolatedTime < 1.0f) {
            if(mType == EXPAND) {
                mLayoutParams.height =  (int)(mEndHeight * interpolatedTime);
            } else {
                mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime));
            }
            mView.requestLayout();
        } else {
            if(mType == EXPAND) {
                mLayoutParams.height = LayoutParams.WRAP_CONTENT;
                mView.requestLayout();
            }else{
                mView.setVisibility(View.GONE);
            }
        }
    }
}

onclick()使用するには、次のように設定します。

int height;

@Override
public void onClick(View v) {
    if(view2.getVisibility() == View.VISIBLE){
        MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.COLLAPSE);
        height = a.getHeight();
        view2.startAnimation(a);
    }else{
        MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.EXPAND);
        a.setHeight(height);
        view2.startAnimation(a);
    }
}

よろしく。

于 2013-01-06T21:03:15.093 に答える
4

アプリで同じことが起こることを望んでいました。これを達成するには:

  1. Res/anim で適切なアニメーションを作成します。左の種類のアニメーションからスライド アウトを使用しました。これに満足できない場合は、他のものをグーグルで検索できます。

    slide_out_left.xml

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="0"
        android:toXDelta="-50%p" />
    
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
    

  2. 上で定義したアニメーションを、アニメーション化したいビューに添付します (この場合、child1 には text1 と text2 が含まれています)。

    Animation outAnimation;
    LinearLayout a1 = (LinearLayout)findViewById(R.id.child1); 
    
    outAnimation = (Animation) AnimationUtils.loadAnimation (getApplicationContext(), R.anim.slide_out_left);
    
    a1.setAnimation(outAnimation);
    outAnimation.setAnimationListener(new  AnimationListener() {
    
        @Override
        public void onAnimationEnd(Animation arg0) {
        a1.setVisibility(View.GONE);                            
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub                          
        }
    
        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub
        }                 
    });
    a1.startAnimation(outAnimation);
    

child1がゆっくりとスライドすると、text3がスライドインしているように自動的に錯覚するため、text3の代わりにchild1でアニメーションを添付しました.

于 2012-11-02T06:12:19.313 に答える
2

このアニメーション XML を使用する slide_in_left.XML

<translate
    android:duration="500"
    android:fromXDelta="-100%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
</set>

およびslide_in_right.XML

<translate
    android:duration="500"
    android:fromXDelta="100%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
</set>

このアニメーションを使用する アニメーション Slideinleft、slideinright;

このアニメーションを初期化します

public void AnimationInitialization() {

    slideinleft= AnimationUtils
            .loadAnimation(this, R.anim.slide_in_left);


    slideinright= AnimationUtils.loadAnimation(this,
            R.anim.slide_in_right);

}

可視性を変更するためにこの2つの関数を呼び出します

public void showMenu() {

    linearlayout_first.clearAnimation();

    linearlayout_first.startAnimation(slideinleft);

    linearlayout_first.setVisibility(View.VISIBLE);

}

public void hideMenu() {

    linearlayout_second.clearAnimation();
    linearlayout_second.startAnimation(slideinright);


    linearlayout_second.setVisibility(View.GONE);
}

必要に応じてレイアウトを変更できます。アニメーション XML の Xdelta と Ydelta でも変化します。

于 2012-10-30T13:08:48.590 に答える
1

ドキュメントは少し混乱しています。のためandroid:animateLayoutChangesに、それは言う

... このフラグが true に設定されている場合、デフォルトの LayoutTransition オブジェクトが ViewGroup コンテナに設定され、これらのレイアウトの変更が発生したときにデフォルトのアニメーションが実行されます。

ViewGroup クラスのsetLayoutTransitionメソッドのドキュメントには次のように書かれています。

デフォルトでは、トランジション オブジェクトは null です (したがって、レイアウトの変更はアニメーション化されません)。

LayoutTransitionレイアウトにa を設定してみてください。

これを行う例を次に示します.. http://www.java2s.com/Code/Android/UI/UseLayoutTransitiontoautomatetransitionanimationsasitemsarehiddenorshowninacontainer.htm

于 2012-10-31T16:01:12.630 に答える