Files
EhViewer/app/src/main/java/com/hippo/view/ViewTransition.java
T
2022-05-18 11:40:29 +08:00

132 lines
4.1 KiB
Java

/*
* Copyright (C) 2015 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.View;
import android.view.ViewPropertyAnimator;
public class ViewTransition {
protected static final long ANIMATE_TIME = 300L;
private final View[] mViews;
protected ViewPropertyAnimator mAnimator1;
protected ViewPropertyAnimator mAnimator2;
private int mShownView = -1;
private OnShowViewListener mOnShowViewListener;
public ViewTransition(View... views) {
if (views.length < 2) {
throw new IllegalStateException("You must pass view to ViewTransition");
}
for (View v : views) {
if (v == null) {
throw new IllegalStateException("Any View pass to ViewTransition must not be null");
}
}
mViews = views;
showView(0, false);
}
public void setOnShowViewListener(OnShowViewListener listener) {
mOnShowViewListener = listener;
}
public int getShownViewIndex() {
return mShownView;
}
public boolean showView(int shownView) {
return showView(shownView, true);
}
public boolean showView(int shownView, boolean animation) {
View[] views = mViews;
int length = views.length;
if (shownView >= length || shownView < 0) {
throw new IndexOutOfBoundsException("Only " + length + " view(s) in " +
"the ViewTransition, but attempt to show " + shownView);
}
if (mShownView != shownView) {
int oldShownView = mShownView;
mShownView = shownView;
// Cancel animation
if (mAnimator1 != null) {
mAnimator1.cancel();
}
if (mAnimator2 != null) {
mAnimator2.cancel();
}
if (animation) {
startAnimations(views[oldShownView], views[shownView]);
} else {
for (int i = 0; i < length; i++) {
View v = views[i];
if (i == shownView) {
v.setAlpha(1f);
v.setVisibility(View.VISIBLE);
} else {
v.setAlpha(0f);
v.setVisibility(View.GONE);
}
}
}
if (null != mOnShowViewListener) {
mOnShowViewListener.onShowView(views[oldShownView], views[shownView]);
}
return true;
} else {
return false;
}
}
protected void startAnimations(final View hiddenView, final View shownView) {
mAnimator1 = hiddenView.animate().alpha(0);
mAnimator1.setDuration(ANIMATE_TIME).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (hiddenView != null) {
hiddenView.setVisibility(View.GONE);
}
mAnimator1 = null;
}
}).start();
shownView.setAlpha(0);
shownView.setVisibility(View.VISIBLE);
mAnimator2 = shownView.animate().alpha(1);
mAnimator2.setDuration(ANIMATE_TIME).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mAnimator2 = null;
}
}).start();
}
public interface OnShowViewListener {
void onShowView(View hiddenView, View shownView);
}
}