布局扩展动画

时间:2012-04-11 06:18:02

标签: android android-layout android-animation

我使用以下代码完成了布局展开动画。当我们通过单击文本视图调用动画时,它工作正常,但当我尝试通过单击布局来执行此操作时,不会发生相同的情况。任何人都可以帮我解决这个问题吗?

LinearLayout hello= (LinearLayout)findViewById(R.id.lin_hello);
final RelativeLayout rel=(RelativeLayout)findViewById(R.id.rel_nah_hide);
hello.setOnClickListener(new OnClickListener() {        
    @Override
    public void onClick(View v) {
        expand=!expand;
        Animation a=expand(rel, expand);
        rel.setAnimation(a);
        a.start();
    }
});

public static Animation expand(final View v, final boolean expand) {
    try {
        Method m = v.getClass().getDeclaredMethod("onMeasure", int.class, int.class);
        m.setAccessible(true);
        m.invoke(v,
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                 MeasureSpec.makeMeasureSpec(((View)v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST)
        );
    } catch (Exception e) {
        e.printStackTrace();
    }

    final int initialHeight = v.getMeasuredHeight();

    if (expand) {
        v.getLayoutParams().height = 0;
    } else {
        v.getLayoutParams().height = initialHeight;
    }
    v.setVisibility(View.VISIBLE);

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            int newHeight = 0;
            if (expand) {
                newHeight = (int) (initialHeight * interpolatedTime);
            } else {
                newHeight = (int) (initialHeight * (1 - interpolatedTime));
            }
            v.getLayoutParams().height = newHeight;
            v.requestLayout();

            if (interpolatedTime == 1 && !expand)
                v.setVisibility(View.GONE);
        }

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

    a.setDuration(SPEED_ANIMATION_TRANSITION);
    a.setAnimationListener(new AnimationListener(){
        @Override
        public void onAnimationEnd(Animation arg0) {
            animWorkingFlag=false;
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onAnimationStart(Animation animation) {
            animWorkingFlag=true;
        }
    });

    return a;
}

以下是xml布局,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout 
        android:id="@+id/lin_hello"
        android:layout_height="50dp"
        android:layout_width="fill_parent"
        android:orientation="vertical">
        <TextView 
            android:id="@+id/hello"
            android:layout_height="50dp"
            android:layout_width="fill_parent"
            android:text="Nah"
            android:gravity="center"
            android:background="#F03535"/>
    </LinearLayout>

    <RelativeLayout 
        android:id="@+id/rel_nah_hide"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent">
        <TextView 
            android:id="@+id/txt_nah_hide1"
            android:layout_height="50dp"
            android:layout_width="fill_parent"
            android:text="Incorrect Name/Address"
            android:gravity="center"
            android:textColor="@color/white"/>
        <TextView 
            android:id="@+id/txt_nah_hide2"
            android:layout_height="50dp"
            android:layout_width="fill_parent"
            android:text="Venue is closed"
            android:gravity="center"
            android:textColor="@color/white"
            android:layout_below="@id/txt_nah_hide1"/>
        <TextView 
            android:id="@+id/txt_nah_hide3"
            android:layout_height="50dp"
            android:layout_width="fill_parent"
            android:text="Venue is duplicate"
            android:gravity="center"
            android:textColor="@color/white"
            android:layout_below="@id/txt_nah_hide2"/>
    </RelativeLayout>

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="28dp"
        android:text="heelo2222"/>
</LinearLayout>

1 个答案:

答案 0 :(得分:2)

使用下一部分代码: - &gt;

View hello= findViewById(R.id.lin_hello);
final RelativeLayout rel=(RelativeLayout)findViewById(R.id.rel_nah_hide);
hello.setOnClickListener(new OnClickListener() {        
    @Override
    public void onClick(View v) {
        expand=!expand;
        Animation a=expand(rel, expand);
        rel.setAnimation(a);
        a.start();
    }
});