不知道什么原因,在处理那个pathview的时候,将viewsetVisibility(View.GONE)一直无效,具体原因还未找出,但找到了一个解决方案,先记录一下。
import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.view.animation.Animation; import android.view.animation.AnticipateInterpolator; import android.view.animation.OvershootInterpolator; import android.view.animation.RotateAnimation; import android.view.animation.TranslateAnimation; public class PathAnimations{ private final String TAG = "MYAnimation"; private float maxOffset = 160; private double maxAngle= Math.PI/2; public void initOffset(Context context) {//初始化 maxOffset = context.getResources().getDimension(R.dimen.set_fly_dimens); } public PathAnimations(long duration ,float maxOffset){ this.duration = duration; this.maxOffset = maxOffset; } private long duration = 500; public void setDuration(long time){ duration = time; } public void setOffset(float offset){ maxOffset =offset; } public static Animation getRotateAnimation(float fromDegrees, float toDegrees, int durationMillis) { RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setDuration(durationMillis); rotate.setFillAfter(true); return rotate; } /** * 围绕90度旋转 * @param viewgroup * @param durationMillis */ public void startAnimationsOut(ViewGroup viewgroup) { viewgroup.setVisibility(View.VISIBLE); int counts = viewgroup.getChildCount(); Log.i(TAG,counts+",out"); double singleAngle; if(counts>1) singleAngle = maxAngle/(counts-1); else{ singleAngle = maxAngle; } float xOffset,yOffset; for (int i = 0; i < counts; i++) { xOffset = (float) Math.cos(singleAngle*i)*maxOffset; yOffset = (float) Math.sin(singleAngle*i)*maxOffset; Log.i(TAG,xOffset+",yOffset:"+yOffset); View inoutimagebutton = (View) viewgroup .getChildAt(i); inoutimagebutton.setVisibility(View.VISIBLE); MarginLayoutParams mlp = (MarginLayoutParams) inoutimagebutton .getLayoutParams(); Animation animation = new TranslateAnimation( xOffset, 0F, yOffset, 0F); animation.setFillAfter(true); animation.setDuration(duration); animation.setStartOffset((i * 100) / (-1 + viewgroup.getChildCount())); animation.setInterpolator(new OvershootInterpolator(2F)); inoutimagebutton.startAnimation(animation); } } /** * 飞入 * @param viewgroup * @param durationMillis */ public void startAnimationsIn(final ViewGroup viewgroup ) { final int counts = viewgroup.getChildCount(); double singleAngle; if(counts>1) singleAngle = maxAngle/(counts-1); else{ singleAngle = maxAngle; } float xOffset,yOffset; for (int i = 0; i < counts; i++) { xOffset = (float) Math.cos(singleAngle*i)*maxOffset; yOffset = (float) Math.sin(singleAngle*i)*maxOffset; final View inoutimagebutton = viewgroup .getChildAt(i); Animation animation = new TranslateAnimation(0F, xOffset, 0F, yOffset); animation.setFillAfter(true); animation.setDuration(duration); animation.setStartOffset(((counts- i) * 100) / (-1 + viewgroup.getChildCount()));// 顺序倒一下比较舒服 animation.setInterpolator(new AnticipateInterpolator(2F)); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation arg0) { } @Override public void onAnimationRepeat(Animation arg0) { } @Override public void onAnimationEnd(Animation arg0) { Log.i(TAG,"onAnimationEnd"); if(viewgroup.getChildAt(0)==inoutimagebutton){ Log.i(TAG,"0 child 相等"); } if(viewgroup.getChildAt(1)==inoutimagebutton){ Log.i(TAG,"1 child 相等"); } if(viewgroup.getChildAt(counts-1)==inoutimagebutton){ inoutimagebutton.setVisibility(View.GONE); Log.i(TAG,inoutimagebutton.getVisibility()+"'"); // viewgroup.setVisibility(View.GONE); //无奈之举。。。当所有子都设置完后,将布局文件也设置为GONE. return ; } inoutimagebutton.setVisibility(View.GONE);//单独设置这个压根没用 Log.i(TAG,inoutimagebutton.getVisibility()+"'"); } }); inoutimagebutton.startAnimation(animation); // inoutimagebutton.setVisibility(View.GONE);//即使在这里设置也毫无效果。 } } }
下面是我的布局文件。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <RelativeLayout android:id="@+id/hide_fly_relative" android:layout_width="match_parent" android:clipChildren="false" android:clipToPadding="false" android:layout_height="match_parent" > <ImageView android:id="@+id/trans_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginRight="@dimen/set_fly_dimens" android:src="@drawable/trans_logo_youdao" android:visibility="gone" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="@dimen/set_fly_dimens" android:src="@drawable/ic_launcher" android:visibility="gone" /> </RelativeLayout> <EditText android:id="@+id/search_content" android:layout_width="match_parent" android:layout_height="@dimen/right_bar_width" android:ems="10" android:visibility="gone" > <requestFocus /> </EditText> <RelativeLayout android:id="@+id/select_bar" android:layout_width="@dimen/right_bar_width" android:layout_height="match_parent" android:layout_gravity="right" android:layout_alignParentRight="true" android:orientation="vertical" > <ImageView android:id="@+id/search" android:layout_width="match_parent" android:layout_height="@dimen/right_bar_width" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/ic_action_search" /> <ImageView android:id="@+id/imageView2" android:layout_below="@id/search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/set" android:layout_width="wrap_content" android:layout_height="@dimen/right_bar_width" android:layout_alignParentBottom="true" android:src="@drawable/set" /> </RelativeLayout> </RelativeLayout>
PathAnimation中的传入的ViewGroup 是hide_fly_relative。我试过其他的,PathMenu,其实他也没处理好这个问题。有时间得去看看源码。找找原因。
额,前几天找到原因了,其实是因为设置了Animation的setFillAfter(true)。所以在动画结束的时候,那个被施加动画的View 还在继续被动画占用。如果想要取消占用,自然考虑取消动画咯。view.clearAnimation()。结构,就ok了咯