package com.yaoyumeng.v2ex.ui.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Path;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SearchView;
import android.widget.TextView;
import com.yaoyumeng.v2ex.R;
import com.yaoyumeng.v2ex.utils.InputUtils;
/**
* Created by yw on 2015/7/19.
*/
public class CustomSpinner extends TextView {
private PopupWindow popup = null;
private CustomSpinner topButton;
private SearchListView mListView;
private OnItemSelectedListener mListener;
private Context mContext;
private Animation showAnimation;
private Animation dismissAnimation;
public boolean isShowPopup() {
return popup != null ? popup.isShowing() : false;
}
public CustomSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
topButton = this;
initView(mContext);
}
private void initView(final Context c) {
ArrowView arrow = new ArrowView(c, null, topButton);
topButton.setCompoundDrawables(null, null, arrow.getDrawable(), null);
// click button text on to popupWindow
topButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
initPopupWindow(c);
}
});
mListView = new SearchListView(c);
mListView.setOverScrollMode(View.OVER_SCROLL_NEVER);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Object obj = parent.getItemAtPosition(position);
topButton.setText(obj.toString());
dismiss();
if(mListener != null)
mListener.onItemSelected(parent, view, position, id);
}
});
}
protected void initPopupWindow(Context context) {
if (popup == null) {
popup = new PopupWindow(mContext);
popup.setWidth(topButton.getWidth());
popup.setBackgroundDrawable(new ColorDrawable(0xffffffff));
popup.setFocusable(true);
popup.setHeight(WindowManager.LayoutParams.FILL_PARENT);
popup.setOutsideTouchable(false);
popup.setContentView(mListView);
//解决 popup 弹出输入法被遮挡问题
popup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
showPop();
}
public void showPop() {
if (!popup.isShowing()) {
if (showAnimation == null) {
showAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
showAnimation.setInterpolator(new AccelerateInterpolator());
showAnimation.setDuration(100);
}
popup.getContentView().startAnimation(showAnimation);
popup.showAsDropDown(topButton);
InputUtils.popSoftkeyboard(getContext(), mListView.mSearchView, true);
}
}
public void dismiss() {
if (popup.isShowing()) {
if (dismissAnimation == null) {
dismissAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f);
dismissAnimation.setDuration(150);
dismissAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
new Handler().post(new Runnable() {
@Override
public void run() {
popup.dismiss();
}
});
}
});
}
popup.getContentView().startAnimation(dismissAnimation);
}
}
public void setAdapter(ArrayAdapter<?> adapter) {
if (mListView != null) {
mListView.setAdapter(adapter);
}
}
public interface OnItemSelectedListener {
void onItemSelected(AdapterView<?> parent, View view, int position, long id);
void onNothingSelected(AdapterView<?> parent);
}
public void setOnItemSelectedListener(OnItemSelectedListener listener) {
this.mListener = listener;
}
class ArrowView extends View {
private int width;
private int height;
protected ShapeDrawable shape;
public ArrowView(Context context, AttributeSet set, View v) {
super(context, set);
// this.mContext = context;
width = 30;
height = 20;
Path p = new Path();
p.moveTo(0, 0);
p.lineTo(width, 0);
p.lineTo(width / 2, height);
p.lineTo(0, 0);
shape = new ShapeDrawable(new PathShape(p, width, height));
shape.getPaint().setColor(Color.BLACK);
shape.setBounds(0, 0, width, height);
}
public void setColor(int color) {
shape.getPaint().setColor(color);
}
protected Drawable getDrawable() {
Canvas canvas = new Canvas();
shape.draw(canvas);
this.draw(canvas);
return shape;
}
}
class SearchListView extends LinearLayout implements SearchView.OnQueryTextListener {
private SearchView mSearchView;
private ListView mListView;
private ArrayAdapter<?> mAdapter;
public SearchListView(Context context) {
super(context);
init();
}
public SearchListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SearchListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
setOrientation(VERTICAL);
inflate(getContext(), R.layout.layout_select_node, this);
mSearchView = ((SearchView) findViewById(R.id.search));
mListView = ((ListView) findViewById(R.id.select_node_listview));
mSearchView.setSubmitButtonEnabled(false);
mSearchView.setOnQueryTextListener(this);
mSearchView.setIconifiedByDefault(false);
mListView.setVisibility(GONE);
}
public void setAdapter(ArrayAdapter<?> adapter) {
if (mAdapter == null) {
mListView.setVisibility(VISIBLE);
}
mAdapter = adapter;
mListView.setAdapter(adapter);
mAdapter.getFilter().filter(mSearchView.getQuery());
}
public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
mListView.setOnItemClickListener(listener);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (mAdapter == null) {
return true;
}
mAdapter.getFilter().filter(newText);
return true;
}
}
}