package com.hdl.sdk.sourceos.knob; import android.os.Handler; import android.os.Looper; import android.util.Log; import java.util.concurrent.atomic.AtomicLong; /** * 旋钮大于200毫秒 * 左右互斥,灵动左右旋钮半格有问题 */ public abstract class IKnobListenerAdapter extends OsEventListener { //左旋 public static final int LEFT_KEY_CODE = 132; //右旋 public static final int RIGHT_KEY_CODE = 131; private static final long MAX_LONG_CLICK_TIME = 500L; private static final long MAX_ROTATE_TIME = 500L; private static final Handler mHandler = new Handler(Looper.getMainLooper()); //上一次点击时间 private final AtomicLong lastClickTime = new AtomicLong(0); //上一次旋转时间 private final AtomicLong lastRotateTime = new AtomicLong(0); private final AtomicLong rotateCount = new AtomicLong(0); //上一次 public IKnobListenerAdapter() { } public void clear() { mHandler.removeCallbacksAndMessages(null); } /** * 长按 */ public void onKnobLongClickListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongClick"); } /** * 点击 */ public void onKnobClickListener() { Log.i("knob", "IKnobListenerAdapter:onKnobClick"); } /** * 向左旋转 */ public void onKnobLongLeftListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongLeft"); } public void onKnobLeftListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLeft"); } /** * 向右旋转 */ public void onKnobRightListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongRight"); } public void onKnobLongRightListener() { Log.i("knob", "IKnobListenerAdapter:onKnobRight"); } @Override public void onKeyEvent(int keyCode, int action) { long time = System.currentTimeMillis(); if (keyCode == LEFT_KEY_CODE) { //向左旋转 if (action == 1) {//1是稳定状态 mHandler.removeCallbacks(mKnobRightRunnable); mHandler.postDelayed(mKnobLeftRunnable, 150); if (time - lastRotateTime.get() < MAX_ROTATE_TIME) { if (rotateCount.get() > 4) { rotateCount.set(0); lastRotateTime.set(0); //快速旋转 mHandler.post(mKnobLongLeftRunnable); } rotateCount.set(rotateCount.get() + 1); } else { lastRotateTime.set(time); } } } else if (keyCode == RIGHT_KEY_CODE) { //向右旋转 if (action == 1) {//1是稳定状态 mHandler.removeCallbacks(mKnobLeftRunnable); mHandler.postDelayed(mKnobRightRunnable, 150); if (time - lastRotateTime.get() < MAX_ROTATE_TIME) { if (rotateCount.get() > 4) { rotateCount.set(0); lastRotateTime.set(0); //快速旋转 mHandler.post(mKnobLongRightRunnable); } rotateCount.set(rotateCount.get() + 1); } else { lastRotateTime.set(time); } } } } private final Runnable mKnobLeftRunnable = new Runnable() { @Override public void run() { onKnobLeftListener(); } }; private final Runnable mKnobLongLeftRunnable = new Runnable() { @Override public void run() { onKnobLongLeftListener(); } }; private final Runnable mKnobRightRunnable = new Runnable() { @Override public void run() { onKnobRightListener(); } }; private final Runnable mKnobLongRightRunnable = new Runnable() { @Override public void run() { onKnobLongRightListener(); } }; private final Runnable mKnobLongClickRunnable = new Runnable() { @Override public void run() { onKnobLongClickListener(); } }; private final Runnable mKnobClickRunnable = new Runnable() { @Override public void run() { onKnobClickListener(); } }; }