package ren.solid.library.behavior; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.support.v4.view.ViewCompat; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.ImageView; import ren.solid.library.R; /** * 图片控件位置动画 * * @author wangchenlong */ @SuppressWarnings("unused") public class AvatarImageBehavior extends CoordinatorLayout.Behavior<ImageView> { private static String TAG = "AvatarImageBehavior"; private final static float MIN_AVATAR_PERCENTAGE_SIZE = 0.3f; private final static int EXTRA_FINAL_AVATAR_PADDING = 80; private int mStartYPosition; // 起始的Y轴位置 private int mFinalYPosition; // 结束的Y轴位置 private int mStartHeight; // 开始的图片高度 private int mFinalHeight; // 结束的图片高度 private int mStartXPosition; // 起始的X轴位置 private int mFinalXPosition; // 结束的X轴位置 private float mStartToolbarPosition; // Toolbar的起始位置 private final Context mContext; private float mAvatarMaxSize; public AvatarImageBehavior(Context context, AttributeSet attrs) { mContext = context; init(); } private void init() { bindDimensions(); } private void bindDimensions() { mAvatarMaxSize = mContext.getResources().getDimension(R.dimen.image_width); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { Log.i(TAG, "layoutDependsOn:" + (dependency instanceof Toolbar)); // 依赖Toolbar控件 return dependency instanceof Toolbar; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) { Log.i(TAG, "onDependentViewChanged:" + (dependency instanceof Toolbar) + " getStatusBarHeight():" + getStatusBarHeight()); // 初始化属性 shouldInitProperties(child, dependency); Log.i(TAG, "mStartToolbarPosition:" + mStartToolbarPosition); // 最大滑动距离: 起始位置-状态栏高度 final int maxScrollDistance = (int) (mStartToolbarPosition-getStatusBarHeight()); Log.i(TAG, "maxScrollDistance:" + maxScrollDistance); // 滑动的百分比 float expandedPercentageFactor = dependency.getY() / maxScrollDistance; Log.i(TAG, "dependency.getY():" + dependency.getY()); // Y轴距离 float distanceYToSubtract = ((mStartYPosition - mFinalYPosition) * (1f - expandedPercentageFactor)) + (child.getHeight()/2); // X轴距离 float distanceXToSubtract = ((mStartXPosition - mFinalXPosition) * (1f - expandedPercentageFactor)) + (child.getWidth() / 2); // 高度减小 float heightToSubtract = ((mStartHeight - mFinalHeight) * (1f - expandedPercentageFactor)); // 图片位置 child.setY(mStartYPosition - distanceYToSubtract); child.setX(mStartXPosition - distanceXToSubtract); // 图片大小 CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); lp.width = (int) (mStartHeight - heightToSubtract); lp.height = (int) (mStartHeight - heightToSubtract); child.setLayoutParams(lp); return true; } /** * 初始化动画值 * * @param child 图片控件 * @param dependency ToolBar */ private void shouldInitProperties(ImageView child, View dependency) { // 图片控件中心 if (mStartYPosition == 0) mStartYPosition = (int) (child.getY() + (child.getHeight() / 2)); // Toolbar中心 if (mFinalYPosition == 0) mFinalYPosition = (dependency.getHeight() /2); // 图片高度 if (mStartHeight == 0) mStartHeight = child.getHeight(); // Toolbar缩略图高度 if (mFinalHeight == 0) mFinalHeight = 0; //mContext.getResources().getDimensionPixelOffset(R.dimen.image_final_width); // 图片控件水平中心 if (mStartXPosition == 0) mStartXPosition = (int) (child.getX() + (child.getWidth() / 2)); // 边缘+缩略图宽度的一半 if (mFinalXPosition == 0) mFinalXPosition = mContext.getResources().getDimensionPixelOffset(R.dimen.abc_action_bar_default_height_material) + (mFinalHeight / 2); // Toolbar的起始位置 if (mStartToolbarPosition == 0) mStartToolbarPosition = dependency.getY() + (dependency.getHeight() / 2); } // 获取状态栏高度 public int getStatusBarHeight() { int result = 0; int resourceId = mContext.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = mContext.getResources().getDimensionPixelSize(resourceId); } return result; } }