CoordinatorLayoutExample
- 类别: 手势交互 (Gesture)
- 打分: ★★★★★
- 更新: 2015-08-27 11:00
- 大小: 3000 kb
- 开发环境: Android Studio
- 浏览: 1094 次
- 下载: 214 次
- 项目地址: https://github.com/saulmm/CoordinatorLayoutExample
介绍:
通过复制了环聊中人物头像的动画演示CoordinatorLayout.Behavior 的用法。
运行效果:
使用说明:
AvatarImageBehavior
package saulmm.myapplication; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.view.View; import de.hdodenhof.circleimageview.CircleImageView; @SuppressWarnings("unused") public class AvatarImageBehavior extends CoordinatorLayout.Behavior<CircleImageView> { 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 mMarginTop; private float mFinalLeftAvatarPadding; private float mStartPosition; private int mStartXPosition; public AvatarImageBehavior(Context context, AttributeSet attrs) { mContext = context; init(); mFinalLeftAvatarPadding = context.getResources().getDimension( R.dimen.abc_action_bar_navigation_padding_start_material); } private void init() { bindDimensions(); } private void bindDimensions() { mAvatarMaxSize = mContext.getResources().getDimension(R.dimen.image_width); mMarginTop = mContext.getResources().getDimension(R.dimen.image_margin); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, CircleImageView child, View dependency) { return dependency instanceof Toolbar; } private int mStartYPosition = 0; private int mFinalYPosition = 0; private int finalHeight = 0; private int mStartHeight = 0; private int mFinalXPosition = 0; @Override public boolean onDependentViewChanged(CoordinatorLayout parent, CircleImageView child, View dependency) { // Called once 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); final int maxScrollDistance = (int) (mMarginTop - 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; } 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; } }