从特定点为视图设置动画以填充整个屏幕,并将其重新调整为该点

时间:2014-02-20 12:05:29

标签: android animation

我知道如何将视图设置为整个屏幕并将其设置为原始大小。这是执行此操作的链接Re sizing through animation

但问题是,只有当我的视图位于屏幕的开头时,此技术才有效。

我想要的是,如果我的高度和宽度(50,50)的视图被放置在屏幕中央的某个按钮下方,我点击该视图它应该设置动画以填满整个屏幕,再次点击时它会动画回到原始大小(50,50)

1 个答案:

答案 0 :(得分:6)

如果您正在使用LinearLayout,请尝试为此动画设置AnimationListener并适当切换按钮的可见性。在“展开”视图时将按钮的可见性设置为View.GONE onAnimationStart,并在“折叠”时将其设置为View.VISIBLE onAnimationEnd。使用RelativeLayout也可以解决这个问题。

对于动画:

public class ExpandCollapseViewAnimation extends Animation {
int targetWidth;
int targetHeight;
int initialWidth;
int initialHeight; 
boolean expand;
View view;

public ExpandCollapseViewAnimation(View view, int targetWidth, int targetHeight ,boolean expand) {
    this.view = view;
    this.targetWidth = targetWidth;
    this.targetHeight = targetHeight;
    this.initialWidth = view.getWidth();
    this.initialHeight = view.getHeight();
    this.expand = expand;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    int newWidth, newHeight;
    if (expand) {
        newWidth = this.initialWidth
                + (int) ((this.targetWidth - this.initialWidth) * interpolatedTime);
        newHeight = this.initialHeight
                + (int) ((this.targetHeight - this.initialHeight) * interpolatedTime);
    } else {
        newWidth = this.initialWidth
                - (int) ((this.initialWidth - this.targetWidth) * interpolatedTime);
        newHeight = this.initialHeight
                - (int) ((this.initialHeight - this.targetHeight) * interpolatedTime);
    }

    view.getLayoutParams().width = newWidth;
    view.getLayoutParams().height = newHeight;
    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;
}

}

布局XML:

<LinearLayout 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:orientation="vertical">

<Button android:id="@+id/btn"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_gravity="center_horizontal"
    android:text="Test"/>


<View android:id="@+id/centered_view"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:clickable="true"
    android:layout_gravity="center_horizontal"
    android:background="#FF0000"/>

</LinearLayout>

此代码有效:

animatedView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (!expand) expandView();
            else collapseView();
        }
    });

private void expandView() {
    expand = true;
    animatedView.clearAnimation();
    Display display = this.getWindowManager().getDefaultDisplay();
    int maxWidth = display.getWidth();
    int maxHeight = display.getHeight();
    ExpandCollapseViewAnimation animation = new ExpandCollapseViewAnimation(animatedView, maxWidth,maxHeight, expand);
    animation.setDuration(500);
    animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            btn.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {    
        }

        @Override
        public void onAnimationEnd(Animation animation) {
        }
    });
    animatedView.startAnimation(animation);
    animatedView.invalidate();
}

private void collapseView() {
    expand = false;
    animatedView.clearAnimation();
    ExpandCollapseViewAnimation animation = new ExpandCollapseViewAnimation(
            animatedView, dpToPx(this, 50),dpToPx(this, 50), expand);
    animation.setDuration(500);
    animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            btn.setVisibility(View.VISIBLE);
        }
    });
    animatedView.startAnimation(animation);
    animatedView.invalidate();
}