View展开隐藏动画

来源:互联网 发布:安兔兔网络连接失败 编辑:程序博客网 时间:2024/06/07 06:26
引用的布局
import com.slidingmenu.R;import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.view.animation.Transformation;import android.widget.ImageView;import android.widget.LinearLayout;public class ExpandableLayout extends LinearLayout {private Context mContext;private LinearLayout mHandleView;private LinearLayout mContentView;private ImageView mIconExpand;int mContentHeight = 0;int mTitleHeight = 0;private boolean isExpand;private Animation animationDown;private Animation animationUp;public ExpandableLayout(Context context, AttributeSet attrs) {super(context, attrs);this.mContext = context;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (this.mContentHeight == 0) {this.mContentView.measure(widthMeasureSpec, 0);this.mContentHeight = this.mContentView.getMeasuredHeight();}if (this.mTitleHeight == 0) {this.mHandleView.measure(widthMeasureSpec, 0);this.mTitleHeight = this.mHandleView.getMeasuredHeight();}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onFinishInflate() {super.onFinishInflate();this.mHandleView = (LinearLayout) this.findViewById(R.id.ll);//点击展开的父类布局this.mContentView = (LinearLayout) this.findViewById(R.id.ll_menu);//要展开的布局this.mIconExpand = (ImageView) this.findViewById(R.id.image);//图片this.mHandleView.setOnClickListener(new ExpandListener());//展开、隐藏监听//this.mContentView.setOnClickListener(new ExpandListener());mContentView.setVisibility(View.GONE);}private class ExpandListener implements View.OnClickListener {@Overridepublic final void onClick(View paramView) {//clearAnimation是view的方法clearAnimation();if (!isExpand) {if (animationDown == null) {animationDown = new DropDownAnim(mContentView,mContentHeight, true);animationDown.setDuration(200); // SUPPRESS CHECKSTYLE}startAnimation(animationDown);mContentView.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.animalpha));mIconExpand.setImageResource(R.drawable.update_detail_up);isExpand = true;} else {isExpand = false;if (animationUp == null) {animationUp = new DropDownAnim(mContentView,mContentHeight, false);animationUp.setDuration(200); // SUPPRESS CHECKSTYLE}startAnimation(animationUp);mIconExpand.setImageResource(R.drawable.update_detail_down);}}}class DropDownAnim extends Animation {/** 目标的高度 */private int targetHeight;/** 目标view */private View view;/** 是否向下展开 */private boolean down;/** * 构造方法 *  * @param targetview *            需要被展现的view * @param vieweight *            目的高 * @param isdown *            true:向下展开,false:收起 */public DropDownAnim(View targetview, int vieweight, boolean isdown) {this.view = targetview;this.targetHeight = vieweight;this.down = isdown;}//down的时候,interpolatedTime从0增长到1,这样newHeight也从0增长到targetHeight@Overrideprotected void applyTransformation(float interpolatedTime,Transformation t) {int newHeight;if (down) {newHeight = (int) (targetHeight * interpolatedTime);} else {newHeight = (int) (targetHeight * (1 - interpolatedTime));}view.getLayoutParams().height = newHeight;view.requestLayout();if (view.getVisibility() == View.GONE) {view.setVisibility(View.VISIBLE);}}@Overridepublic void initialize(int width, int height, int parentWidth,int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);}@Overridepublic boolean willChangeBounds() {return true;}}}

布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="10dp"    android:orientation="vertical" >        <view.ExpandableLayout        android:id="@+id/app_detail_safety_info"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        >        <LinearLayout         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal"        android:id="@+id/ll"        >        <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="19sp"        android:text="展开隐藏布局" />                <ImageView             android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/image"            android:src="@drawable/update_detail_down"            />    </LinearLayout>        <LinearLayout        android:id="@+id/ll_menu"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:padding="10dp"        android:visibility="gone" >         <TextView            android:id="@+id/tv1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="19sp"            android:text="菜单1" />        <TextView            android:id="@+id/tv2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="19sp"            android:text="菜单2" />    </LinearLayout>        </view.ExpandableLayout>          <TextView          android:id="@+id/tv3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="19sp"        android:text="布局1" />        <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="19sp"        android:text="布局2" />   </LinearLayout>
展开、隐藏动画文件R.anim.animalpha

<alpha xmlns:android="http://schemas.android.com/apk/res/android"     android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500"/>


最后显示隐藏布局的id不可重复监听,否则显示监听会无效


0 0
原创粉丝点击