package com.owen.tvrecyclerview.example.bridge;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
/**
* 为了兼容4.3以下版本的 AnimBridge. <br>
* 使用方法: MainUpView.setAnimBridge(new AnimNoDrawBridge()); <br>
* 如果边框带了阴影效果,使用这个函数自行调整: MainUpView.setDrawUpRectPadding(-12);
*
* @author hailongqiu
*
*/
public class EffectNoDrawBridge extends OpenEffectBridge {
protected AnimatorSet mCurrentAnimatorSet;
/**
* 设置背景,边框不使用绘制.
*/
@Override
public void setUpRectResource(int resId) {
getMainUpView().setBackgroundResource(resId);
}
@Override
public void setUpRectDrawable(Drawable upRectDrawable) {
getMainUpView().setBackgroundDrawable(upRectDrawable);
}
@Override
public void onOldFocusView(View oldFocusView, float scaleX, float scaleY) {
if (!isAnimEnabled())
return;
if (oldFocusView != null) {
oldFocusView.animate().scaleX(scaleX).scaleY(scaleY).setDuration(getTranDurAnimTime()).start();
}
}
@Override
public void onFocusView(View focusView, float scaleX, float scaleY) {
if (!isAnimEnabled())
return;
if (focusView != null) {
/**
* 我这里重写了onFocusView. <br>
* 并且交换了位置. <br>
* 你可以写自己的动画效果. <br>
*/
runTranslateAnimation(focusView, scaleX, scaleY);
focusView.animate().scaleX(scaleX).scaleY(scaleY).setDuration(getTranDurAnimTime()).start();
}
}
/**
* 重写边框移动函数.
*/
@Override
public void flyWhiteBorder(final View focusView, View moveView, float scaleX, float scaleY) {
Rect paddingRect = getDrawUpRect();
int newWidth = 0;
int newHeight = 0;
int oldWidth = 0;
int oldHeight = 0;
int newX = 0;
int newY = 0;
if (focusView != null) {
newWidth = (int) (focusView.getMeasuredWidth() * scaleX);
newHeight = (int) (focusView.getMeasuredHeight() * scaleY);
oldWidth = moveView.getMeasuredWidth();
oldHeight = moveView.getMeasuredHeight();
Rect fromRect = findLocationWithView(moveView);
Rect toRect = findLocationWithView(focusView);
int x = toRect.left - fromRect.left - (paddingRect.left);
int y = toRect.top - fromRect.top - (paddingRect.top);
newX = x - Math.abs(focusView.getMeasuredWidth() - newWidth) / 2;
newY = y - Math.abs(focusView.getMeasuredHeight() - newHeight) / 2;
//
newWidth += (paddingRect.right + paddingRect.left);
newHeight += (paddingRect.bottom + paddingRect.top);
}
// 取消之前的动画.
if (mCurrentAnimatorSet != null)
mCurrentAnimatorSet.cancel();
ObjectAnimator transAnimatorX = ObjectAnimator.ofFloat(moveView, "translationX", newX);
ObjectAnimator transAnimatorY = ObjectAnimator.ofFloat(moveView, "translationY", newY);
// BUG,因为缩放会造成图片失真(拉伸).
// hailong.qiu 2016.02.26 修复 :)
ObjectAnimator scaleXAnimator = ObjectAnimator.ofInt(new ScaleView(moveView), "width", oldWidth,
(int) newWidth);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofInt(new ScaleView(moveView), "height", oldHeight,
(int) newHeight);
//
AnimatorSet mAnimatorSet = new AnimatorSet();
mAnimatorSet.playTogether(transAnimatorX, transAnimatorY, scaleXAnimator, scaleYAnimator);
mAnimatorSet.setInterpolator(new DecelerateInterpolator(1));
mAnimatorSet.setDuration(getTranDurAnimTime());
mAnimatorSet.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
if (isVisibleWidget()) {
getMainUpView().setVisibility(View.GONE);
}
if (getNewAnimatorListener() != null)
getNewAnimatorListener().onAnimationStart(EffectNoDrawBridge.this, focusView, animation);
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
getMainUpView().setVisibility(isVisibleWidget() ? View.GONE : View.VISIBLE);
if (getNewAnimatorListener() != null)
getNewAnimatorListener().onAnimationEnd(EffectNoDrawBridge.this, focusView, animation);
// XF add(先锋TV开发(404780246)修复)
// BUG:5.0系统边框错位.
// if (Utils.getSDKVersion() >= 21) {
// int newWidth = (int) (focusView.getMeasuredWidth() *
// mScaleX);
// int newHeight = (int) (focusView.getMeasuredHeight() *
// mScaleY);
// getMainUpView().getLayoutParams().width = newWidth;
// getMainUpView().getLayoutParams().height = newHeight;
// getMainUpView().requestLayout();
// }
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
mAnimatorSet.start();
mCurrentAnimatorSet = mAnimatorSet;
}
/**
* 重写该函数,<br>
* 不进行绘制 边框和阴影.
*/
@Override
public boolean onDrawMainUpView(Canvas canvas) {
return false;
}
}