From 4fe2c1ace3e7a7444b7a1c37cb7f05867745d178 Mon Sep 17 00:00:00 2001 From: seven332 Date: Tue, 25 Aug 2015 12:05:35 +0800 Subject: [PATCH] Improved SearchBar --- .../ehviewer/ui/scene/GalleryListScene.java | 57 ++++++++++--- .../ui/scene/ModifyQuickSearchScene.java | 17 ++-- .../com/hippo/ehviewer/widget/SearchBar.java | 81 ++++++++++++------- 3 files changed, 104 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index a8f4ea694..1ba5288dd 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -38,6 +38,7 @@ import android.widget.Toast; import com.hippo.animation.SimpleAnimatorListener; import com.hippo.conaco.Conaco; import com.hippo.drawable.AddDeleteDrawable; +import com.hippo.drawable.DrawerArrowDrawable; import com.hippo.effect.ViewTransition; import com.hippo.ehviewer.Constants; import com.hippo.ehviewer.EhApplication; @@ -83,13 +84,13 @@ import com.hippo.yorozuya.ViewUtils; import java.util.List; -// TODO remeber the data in ContentHelper after screen dirction change // TODO Must refresh when change source // TODO disable click action when animating // TODO Dim when expand search list public final class GalleryListScene extends Scene implements ListSearchBar.Helper, View.OnClickListener, SearchLayout.SearhLayoutHelper, EasyRecyclerView.OnItemClickListener, - Messenger.Receiver, DrawerProvider, AppbarRecyclerView.Helper, FabLayout.OnExpandListener { + Messenger.Receiver, DrawerProvider, AppbarRecyclerView.Helper, FabLayout.OnExpandListener, + SearchBar.OnStateChangeListener { public static final String KEY_MODE = "mode"; @@ -152,6 +153,9 @@ public final class GalleryListScene extends Scene implements ListSearchBar.Helpe private boolean mLockLeft = false; private boolean mLockRight = false; + private DrawerArrowDrawable mLeftDrawable; + private AddDeleteDrawable mRightDrawable; + private SimpleDialog.OnCreateCustomViewListener mGoToCreateCustomViewListener = new SimpleDialog.OnCreateCustomViewListener() { @Override @@ -294,6 +298,12 @@ public final class GalleryListScene extends Scene implements ListSearchBar.Helpe mSearchLayout.setAction2Text(mResources.getString(R.string.search_mode)); mSearchLayout.setHelper(this); + mLeftDrawable = new DrawerArrowDrawable(getContext()); + mRightDrawable = new AddDeleteDrawable(getContext()); + mSearchBar.setLeftDrawable(mLeftDrawable); + mSearchBar.setRightDrawable(mRightDrawable); + mSearchBar.setOnStateChangeListener(this); + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mSearchBar.getLayoutParams(); ViewUtils.measureView(mSearchBar, 200, ViewGroup.LayoutParams.WRAP_CONTENT); int fitPaddingTop = mSearchBar.getMeasuredHeight() + lp.topMargin; @@ -642,19 +652,21 @@ public final class GalleryListScene extends Scene implements ListSearchBar.Helpe } @Override - public void onClickMenu() { - mActivity.toggleDrawer(); + public void onClickLeftIcon() { + if (mSearchBar.getState() == SearchBar.STATE_NORMAL) { + mActivity.toggleDrawer(); + } else { + onBackPressed(); + } } @Override - public void onClickArrow() { - onBackPressed(); - } - - @Override - public void onClickAdvanceSearch() { - if (mState == STATE_NORMAL) { + public void onClickRightIcon() { + if (mSearchBar.getState() == SearchBar.STATE_NORMAL) { setState(STATE_SEARCH); + } else { + // Clear + mSearchBar.setText(""); } } @@ -824,6 +836,29 @@ public final class GalleryListScene extends Scene implements ListSearchBar.Helpe } } + @Override + public void onStateChange(int newState, int oldState, boolean animation) { + switch (oldState) { + default: + case SearchBar.STATE_NORMAL: + mLeftDrawable.setArrow(animation ? ANIMATE_TIME : 0); + mRightDrawable.setDelete(animation ? ANIMATE_TIME : 0); + break; + case SearchBar.STATE_SEARCH: + if (newState == SearchBar.STATE_NORMAL) { + mLeftDrawable.setMenu(animation ? ANIMATE_TIME : 0); + mRightDrawable.setAdd(animation ? ANIMATE_TIME : 0); + } + break; + case SearchBar.STATE_SEARCH_LIST: + if (newState == STATE_NORMAL) { + mLeftDrawable.setMenu(animation ? ANIMATE_TIME : 0); + mRightDrawable.setAdd(animation ? ANIMATE_TIME : 0); + } + break; + } + } + private class AddToQuickSearchHelper implements SimpleDialog.OnCreateCustomViewListener, SimpleDialog.OnClickListener { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ModifyQuickSearchScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/ModifyQuickSearchScene.java index 7cdf84fe6..47e8f31de 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/ModifyQuickSearchScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/ModifyQuickSearchScene.java @@ -37,11 +37,12 @@ import com.hippo.scene.Announcer; import com.hippo.scene.AppbarScene; import com.hippo.scene.Scene; import com.hippo.scene.SimpleDialog; +import com.hippo.yorozuya.LayoutUtils; import com.hippo.yorozuya.Messenger; import com.hippo.yorozuya.ViewUtils; public class ModifyQuickSearchScene extends AppbarScene implements SearchLayout.SearhLayoutHelper, - SearchBar.Helper { + SearchBar.Helper { public static final String KEY_QUICK_SEARCH = "quick_search"; @@ -71,6 +72,9 @@ public class ModifyQuickSearchScene extends AppbarScene implements SearchLayout. mSearchBar.setState(SearchBar.STATE_SEARCH, false); mSearchBar.setHelper(this); mSearchBar.setEditTextHint(resources.getString(R.string.keyword)); + mSearchBar.setLeftIconVisibility(View.GONE); + mSearchBar.setRightDrawable(resources.getDrawable(R.drawable.ic_close_x24)); + mSearchBar.setEditTextMargin(LayoutUtils.dp2pix(getContext(), 16), LayoutUtils.dp2pix(getContext(), 56)); ViewUtils.measureView(mSearchBar, 200, ViewGroup.LayoutParams.WRAP_CONTENT); mSearchLayout.setFitPaddingTop(mSearchBar.getMeasuredHeight() + @@ -234,18 +238,13 @@ public class ModifyQuickSearchScene extends AppbarScene implements SearchLayout. } @Override - public void onClickMenu() { + public void onClickLeftIcon() { } @Override - public void onClickArrow() { - - } - - @Override - public void onClickAdvanceSearch() { - + public void onClickRightIcon() { + mSearchBar.setText(""); } @Override diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java index 002fc0da3..9492b1703 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java @@ -21,6 +21,7 @@ import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Path; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; @@ -41,8 +42,6 @@ import android.widget.TextView; import com.hippo.animation.SimpleAnimatorListener; import com.hippo.cardsalon.CardView; -import com.hippo.drawable.AddDeleteDrawable; -import com.hippo.drawable.DrawerArrowDrawable; import com.hippo.effect.ViewTransition; import com.hippo.ehviewer.R; import com.hippo.widget.SimpleImageView; @@ -82,14 +81,12 @@ public class SearchBar extends CardView implements View.OnClickListener, private ViewTransition mViewTransition; - private DrawerArrowDrawable mDrawerArrowDrawable; - private AddDeleteDrawable mAddDeleteDrawable; - private SearchDatabase mSearchDatabase; private List mSuggestionList; private ArrayAdapter mSuggestionAdapter; private Helper mHelper; + private OnStateChangeListener mOnStateChangeListener; private boolean mInAnimation = false; @@ -120,13 +117,8 @@ public class SearchBar extends CardView implements View.OnClickListener, mViewTransition = new ViewTransition(mTitleTextView, mEditText); - mDrawerArrowDrawable = new DrawerArrowDrawable(getContext()); - mAddDeleteDrawable = new AddDeleteDrawable(getContext()); - mTitleTextView.setOnClickListener(this); - mMenuButton.setDrawable(mDrawerArrowDrawable); mMenuButton.setOnClickListener(this); - mActionButton.setDrawable(mAddDeleteDrawable); mActionButton.setOnClickListener(this); mEditText.setSearchEditTextListener(this); mEditText.setOnEditorActionListener(this); @@ -171,6 +163,10 @@ public class SearchBar extends CardView implements View.OnClickListener, mHelper = helper; } + public void setOnStateChangeListener(OnStateChangeListener listener) { + mOnStateChangeListener = listener; + } + public void setText(String text) { mEditText.setText(text); } @@ -179,22 +175,37 @@ public class SearchBar extends CardView implements View.OnClickListener, return mEditText.getText().toString(); } + public void setLeftDrawable(Drawable drawable) { + mMenuButton.setDrawable(drawable); + } + + public void setRightDrawable(Drawable drawable) { + mActionButton.setDrawable(drawable); + } + + public void setLeftIconVisibility(int visibility) { + mMenuButton.setVisibility(visibility); + } + + public void setRightIconVisibility(int visibility) { + mActionButton.setVisibility(visibility); + } + + public void setEditTextMargin(int left, int right) { + MarginLayoutParams lp = (MarginLayoutParams) mEditText.getLayoutParams(); + lp.leftMargin = left; + lp.rightMargin = right; + mEditText.setLayoutParams(lp); + } + @Override public void onClick(View v) { if (v == mTitleTextView) { mHelper.onClickTitle(); } else if (v == mMenuButton) { - if (mState == STATE_NORMAL) { - mHelper.onClickMenu(); - } else { - mHelper.onClickArrow(); - } + mHelper.onClickLeftIcon(); } else if (v == mActionButton) { - if (mState == STATE_NORMAL) { - mHelper.onClickAdvanceSearch(); - } else { - mEditText.setText(""); - } + mHelper.onClickRightIcon(); } } @@ -228,38 +239,42 @@ public class SearchBar extends CardView implements View.OnClickListener, case STATE_NORMAL: mViewTransition.showView(1, animation); mEditText.requestFocus(); - mDrawerArrowDrawable.setArrow(animation ? ANIMATE_TIME : 0); - mAddDeleteDrawable.setDelete(animation ? ANIMATE_TIME : 0); + if (state == STATE_SEARCH_LIST) { showImeAndSuggestionsList(animation); } + if (mOnStateChangeListener != null) { + mOnStateChangeListener.onStateChange(state, oldState, animation); + } break; case STATE_SEARCH: if (state == STATE_NORMAL) { mViewTransition.showView(0, animation); - mDrawerArrowDrawable.setMenu(animation ? ANIMATE_TIME : 0); - mAddDeleteDrawable.setAdd(animation ? ANIMATE_TIME : 0); } else if (state == STATE_SEARCH_LIST) { showImeAndSuggestionsList(animation); } + if (mOnStateChangeListener != null) { + mOnStateChangeListener.onStateChange(state, oldState, animation); + } break; case STATE_SEARCH_LIST: hideImeAndSuggestionsList(animation); if (state == STATE_NORMAL) { mViewTransition.showView(0, animation); - mDrawerArrowDrawable.setMenu(animation ? ANIMATE_TIME : 0); - mAddDeleteDrawable.setAdd(animation ? ANIMATE_TIME : 0); + } + if (mOnStateChangeListener != null) { + mOnStateChangeListener.onStateChange(state, oldState, animation); } break; } } } - private void showImeAndSuggestionsList() { + public void showImeAndSuggestionsList() { showImeAndSuggestionsList(true); } - private void showImeAndSuggestionsList(boolean animation) { + public void showImeAndSuggestionsList(boolean animation) { // Show ime InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mEditText, 0); @@ -408,11 +423,15 @@ public class SearchBar extends CardView implements View.OnClickListener, public interface Helper { void onClickTitle(); - void onClickMenu(); - void onClickArrow(); - void onClickAdvanceSearch(); + void onClickLeftIcon(); + void onClickRightIcon(); void onSearchEditTextClick(); void onApplySearch(String query); void onBackPressed(); } + + public interface OnStateChangeListener { + + void onStateChange(int newState, int oldState, boolean animation); + } }