package com.kescoode.adk.ui;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.support.annotation.StringRes;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.kescoode.adk.device.KeyBoard;
import com.kescoode.adk.view.Views;
import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;
/**
* Material Design式的SearchView
*
* @author Kesco Lin
*/
public class ImmersiveSearchBar extends Toolbar {
public static interface ActionBackListener {
void back();
}
private ImageView ivArrow;
private EditText etSearch;
private ImageView ivClose;
private ActionBackListener backListener;
private String hintString;
public ImmersiveSearchBar(Context context) {
this(context, null);
}
public ImmersiveSearchBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ImmersiveSearchBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
construct(context, attrs, defStyleAttr);
}
private void construct(Context context, AttributeSet attrs, int defStyleAttr) {
LayoutInflater.from(context).inflate(R.layout.view_immersive_search, this, true);
ivArrow = Views.findById(this, R.id.iv_arrow_back);
etSearch = Views.findById(this, R.id.et_search);
ivClose = Views.findById(this, R.id.iv_close);
readAttr(context, attrs);
buildView();
attachListener();
}
private void readAttr(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImmersiveSearchBarAttrs);
if (a != null) {
try {
hintString = a.getString(R.styleable.ImmersiveSearchBarAttrs_hint);
} finally {
a.recycle();
}
}
}
private void buildView() {
setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.material_actionbar_size_minimal));
if (!TextUtils.isEmpty(hintString)) {
etSearch.setHint(hintString);
}
}
private void attachListener() {
ivArrow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (backListener != null) {
backListener.back();
}
}
});
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s)) {
ivClose.setVisibility(VISIBLE);
} else {
ivClose.setVisibility(GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
ivClose.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
etSearch.setText("");
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (etSearch.getVisibility() == VISIBLE) {
}
}
/**
* 显示搜索栏,有动画
*
* @param activity 搜索栏依附的
*/
public void appear(Activity activity) {
setVisibility(VISIBLE);
FrameLayout layout = (FrameLayout) activity.getWindow().getDecorView()
.findViewById(android.R.id.content);
RelativeLayout root = (RelativeLayout) findViewById(R.id.rl_root);
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 96,
r.getDisplayMetrics());
int cx = layout.getLeft() + layout.getRight();
int cy = layout.getTop();
int finalRadius = (int) Math.max(layout.getWidth(), px);
SupportAnimator animator = ViewAnimationUtils.createCircularReveal(
root, cx, cy, 0, finalRadius);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(500);
animator.addListener(new SupportAnimator.AnimatorListener() {
@Override
public void onAnimationCancel() {
}
@Override
public void onAnimationEnd() {
showKeyboard(true);
}
@Override
public void onAnimationRepeat() {
}
@Override
public void onAnimationStart() {
}
});
animator.start();
}
public void setBackListener(ActionBackListener backListener) {
this.backListener = backListener;
}
public void setHint(String hint) {
etSearch.setHint(hint);
}
public void setHint(@StringRes int hint) {
setHint(getContext().getResources().getString(hint));
}
public String getResult() {
return etSearch.getText().toString();
}
public void showKeyboard(boolean show) {
if (show) {
etSearch.requestFocus();
KeyBoard.showSoftKeyBoard(getContext());
} else {
KeyBoard.hideSoftKeyBoard(getContext(), etSearch);
}
}
}