package com.anarchy.classifyview.sample.ireader.widget; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.LayoutTransition; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.support.annotation.IntDef; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.anarchy.classify.simple.ChangeInfo; import com.anarchy.classify.simple.PrimitiveSimpleAdapter; import com.anarchy.classify.simple.widget.CanMergeView; import com.anarchy.classify.util.L; import com.anarchy.classifyview.R; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * User: Anarchy * Email: rsshinide38@163.com * Date: 16/12/27 14:44 * Description: */ public class IReaderFolder extends RelativeLayout implements CanMergeView { public static final int STATE_AUTO = 0; /** * 永久显示Folder */ public static final int STATE_FOLDER = 1; @IntDef({STATE_AUTO, STATE_FOLDER}) @Retention(RetentionPolicy.SOURCE) @interface State { } private static final int FOLDER_ID = R.id.i_reader_folder_bg; private static final int TAG_ID = R.id.i_reader_folder_tag; private static final int CONTAINER_GRID_ID = R.id.i_reader_folder_grid; private static final int CHECK_BOX_ID = R.id.i_reader_folder_check_box; private static final int CONTENT_ID = R.id.i_reader_folder_content; private PrimitiveSimpleAdapter mSimpleAdapter; private IReaderGridLayout mGridLayout; private FrameLayout mContent; private TextView mTagView; private View mFolderBg; private int mState = STATE_AUTO; public IReaderFolder(Context context) { super(context); } public IReaderFolder(Context context, AttributeSet attrs) { super(context, attrs); } public IReaderFolder(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public IReaderFolder(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); ensureViewFound(); switch (mState) { case STATE_AUTO: mFolderBg.setVisibility(getChildCount() > 1 ? View.VISIBLE : View.GONE); break; case STATE_FOLDER: mFolderBg.setVisibility(View.VISIBLE); break; } } /** * 设置显示状态 * * @param state */ public void setState(@State int state) { mState = state; } /** * 进入merge状态 */ @Override public void onMergeStart() { mFolderBg.setVisibility(View.VISIBLE); mFolderBg.setPivotX(mFolderBg.getWidth() / 2); mFolderBg.setPivotY(mFolderBg.getHeight() / 2); mFolderBg.animate().scaleX(1.2f).scaleY(1.1f).setDuration(200).start(); } /** * 离开merge状态 */ @Override public void onMergeCancel() { mFolderBg.animate().scaleX(1f).scaleY(1f).setDuration(200).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mFolderBg.animate().setListener(null); switch (mState) { case STATE_AUTO: if (getChildCount() <= 1) { mFolderBg.setVisibility(View.GONE); } break; case STATE_FOLDER: //nope break; } } }); } /** * 结束merge事件 */ @Override public void onMerged() { mFolderBg.animate().scaleX(1f).scaleY(1f).setDuration(200).start(); } /** * 开始merge动画 * * @param duration 动画持续时间 */ @Override public void startMergeAnimation(final int duration) { if(mContent.getVisibility() == View.VISIBLE){ ChangeInfo info = mGridLayout.getSecondItemChangeInfo(); float scaleX = info.targetWidth/mContent.getWidth(); float scaleY = info.targetHeight/mContent.getHeight(); mContent.setPivotX(0); mContent.setPivotY(0); mContent.animate() .scaleX(scaleX).scaleY(scaleY) .translationX(info.targetLeft).translationY(info.targetTop) .setDuration(duration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { restoreViewDelayed(mContent,duration); } @Override public void onAnimationEnd(Animator animation) { restoreViewDelayed(mContent,duration); } }) .start(); }else { final View dummyView = new View(getContext()); mGridLayout.getLayoutTransition().setDuration(duration); mGridLayout.getLayoutTransition().addTransitionListener(new LayoutTransition.TransitionListener() { @Override public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { } @Override public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { mGridLayout.removeView(dummyView); } }); mGridLayout.addView(dummyView,0); } } private void restoreViewDelayed(final View view,int delayTime){ postDelayed(new Runnable() { @Override public void run() { view.setScaleX(1f); view.setScaleY(1f); view.setTranslationX(0f); view.setTranslationY(0f); } },delayTime); } /** * 准备merge * * @return 返回新添加的view 应该放置在布局中的位置坐标 */ @Override public ChangeInfo prepareMerge() { ChangeInfo changeInfo = mGridLayout.getChangeInfo(); int left = getLeft(); int top = getTop(); //修正数值 changeInfo.targetLeft += left + mGridLayout.getLeft(); changeInfo.targetTop += top + mGridLayout.getTop(); changeInfo.sourceLeft = left + mContent.getLeft(); changeInfo.sourceTop = top + mContent.getTop(); changeInfo.sourceWidth = mContent.getWidth(); changeInfo.sourceHeight = mContent.getHeight(); return changeInfo; } /** * 设置适配器 * * @param primitiveSimpleAdapter */ @Override public void setAdapter(PrimitiveSimpleAdapter primitiveSimpleAdapter) { mSimpleAdapter = primitiveSimpleAdapter; } /** * 初始化或更新主层级 * * @param parentIndex * @param requestCount 需要显示里面有几个子view */ @Override public void initOrUpdateMain(int parentIndex, int requestCount) { if(mGridLayout == null){ ensureViewFound(); } if (mGridLayout == null || requestCount <= 0) return; int childCount = mGridLayout.getChildCount(); if (childCount > requestCount) { mGridLayout.removeViews(requestCount,childCount - requestCount); } childCount = mGridLayout.getChildCount(); for (int i = 0; i < requestCount; i++) { View convertView = null; if (i < childCount) { convertView = mGridLayout.getChildAt(i); } View adapterChild = mSimpleAdapter.getView(this, convertView, parentIndex, i); if (adapterChild == null) continue; if (adapterChild == convertView) { //nope } else if (i < childCount) { mGridLayout.removeViewAt(i); mGridLayout.addView(adapterChild, i); } else { mGridLayout.addView(adapterChild, i); } } } /** * 初始化或更新次级层级 * * @param parentIndex * @param subIndex */ @Override public void initOrUpdateSub(int parentIndex, int subIndex) { //nope } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } private void ensureViewFound() { if (mFolderBg == null | mContent == null | mTagView == null | mGridLayout == null) { mFolderBg = findViewById(FOLDER_ID); mContent = (FrameLayout) findViewById(CONTENT_ID); mTagView = (TextView) findViewById(TAG_ID); mGridLayout = (IReaderGridLayout) findViewById(CONTAINER_GRID_ID); mGridLayout.setLayoutTransition(new LayoutTransition()); } } }