package com.mfh.comna.view.widget;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Spinner;
/**
* The class inherited from Spinner. The drop-down list has the following characteristics:
* <ol>
* <li> Use{@link #setOnClickListener(OnClickListener)} to listen the click event and can
* implement self-fulfilling click response action (Spinner's default response action is to open the
* list selection box).</li>
* <li> Click event occurs, the default response is no longer open the list selection box, please
* call {@link #performClick()} instead.</li>
* </ol>
*
* @author yxm
* @date 2014/10/28
*/
public class ClickControlledSpinner extends Spinner {
private boolean isMoved = false;
private Point touchedPoint = new Point();
private OnClickMyListener onClickMyListener;
public ClickControlledSpinner(Context context) {
super(context);
}
public ClickControlledSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ClickControlledSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickControlledSpinner(Context context, int mode) {
super(context, mode);
}
public ClickControlledSpinner(Context context, AttributeSet attrs, int defStyle, int mode) {
super(context, attrs, defStyle, mode);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchedPoint.x = x;
touchedPoint.y = y;
break;
case MotionEvent.ACTION_MOVE:
isMoved = true;
break;
case MotionEvent.ACTION_UP:
if (isMoved) {
//slide from top down
if (y - touchedPoint.y > 20) {
}
//slide from the bottom up
else if (touchedPoint.y - y > 20) {
}
//a small amplitude slide event is considered as a click event
else {
onClick();
}
isMoved = false;
} else {
onClick();
}
break;
default:
break;
}
return true;
}
private void onClick() {
if (onClickMyListener != null && isEnabled()) {
onClickMyListener.onClick();
}
}
public void setOnClickMyListener(OnClickMyListener onClickMyListener) {
this.onClickMyListener = onClickMyListener;
}
public interface OnClickMyListener {
public void onClick();
}
}