package com.alorma.github.ui.utils; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.Toolbar; import com.alorma.github.R; public class AvatarImageBehavior extends CoordinatorLayout.Behavior<ImageView> { private final static float MIN_AVATAR_PERCENTAGE_SIZE = 0.3f; private final static int EXTRA_FINAL_AVATAR_PADDING = 80; private final static String TAG = "behavior"; private final Context mContext; private float mAvatarMaxSize; private float mFinalLeftAvatarPadding; private float mStartPosition; private int mStartXPosition; private float mStartToolbarPosition; private int mStartYPosition; private int mFinalYPosition; private int finalHeight; private int mStartHeight; private int mFinalXPosition; public AvatarImageBehavior(Context context, AttributeSet attrs) { mContext = context; init(); mFinalLeftAvatarPadding = context.getResources().getDimension(R.dimen.spacing_normal); } private void init() { bindDimensions(); } private void bindDimensions() { mAvatarMaxSize = mContext.getResources().getDimension(R.dimen.avatar_size_profile); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { return dependency instanceof Toolbar; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) { shouldInitProperties(child, dependency); final int maxScrollDistance = (int) (mStartToolbarPosition - getStatusBarHeight()); float expandedPercentageFactor = dependency.getY() / maxScrollDistance; float distanceYToSubtract = ((mStartYPosition - mFinalYPosition) * (1f - expandedPercentageFactor)) + (child.getHeight() / 2); float distanceXToSubtract = ((mStartXPosition - mFinalXPosition) * (1f - expandedPercentageFactor)) + (child.getWidth() / 2); float heightToSubtract = ((mStartHeight - finalHeight) * (1f - expandedPercentageFactor)); child.setY(mStartYPosition - distanceYToSubtract); child.setX(mStartXPosition - distanceXToSubtract); int proportionalAvatarSize = (int) (mAvatarMaxSize * (expandedPercentageFactor)); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); lp.width = (int) (mStartHeight - heightToSubtract); lp.height = (int) (mStartHeight - heightToSubtract); child.setLayoutParams(lp); return true; } private void shouldInitProperties(ImageView child, View dependency) { if (mStartYPosition == 0) mStartYPosition = (int) (child.getY() + (child.getHeight() / 2)); if (mFinalYPosition == 0) mFinalYPosition = (dependency.getHeight() / 2); if (mStartHeight == 0) mStartHeight = child.getHeight(); if (finalHeight == 0) { finalHeight = 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_content_inset_material) + (finalHeight / 2); } 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; } }