protected void notifyObservers(final T model) { synchronized (listeners) { for (OnChangeListener<T> listener : listeners) { listener.onChange(model); } } }
@Override public void onClick(View v) { // TODO Auto-generated method stub mDeltX = mSwitchOn ? mMoveLength : -mMoveLength; mSwitchOn = !mSwitchOn; if (mListener != null) { mListener.onChange(this, mSwitchOn); } invalidate(); mDeltX = 0; }
@SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View arg0, MotionEvent event) { actualX = event.getX(); actualY = event.getY(); virtualX = actualX - outerRadius; virtualY = outerRadius - actualY; double radius = outerRadius - innerRadius; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // Fall through ACTION_MOVE case case MotionEvent.ACTION_MOVE: if (Math.sqrt(Math.pow(virtualX, 2) + Math.pow(virtualY, 2)) >= radius) { double angle = Math.atan(virtualY / virtualX); if (virtualY > 0 && virtualX > 0) { virtualX = (float) (Math.cos(angle) * radius); virtualY = (float) (Math.sin(angle) * radius); } else if (virtualY > 0 && virtualX < 0) { virtualX = (float) -Math.abs(Math.cos(angle) * radius); virtualY = (float) Math.abs(Math.sin(angle) * radius); } else if (virtualY < 0 && virtualX < 0) { virtualX = (float) -Math.abs(Math.cos(angle) * radius); virtualY = (float) -Math.abs(Math.sin(angle) * radius); } else if (virtualY < 0 && virtualX > 0) { virtualX = (float) (Math.cos(angle) * radius); virtualY = (float) -Math.abs(Math.sin(angle) * radius); } else { virtualX = 0; virtualY = 0; } actualX = virtualX + outerRadius; actualY = outerRadius - virtualY; } break; case MotionEvent.ACTION_UP: virtualX = 0; virtualY = 0; actualX = virtualX + outerRadius; actualY = outerRadius - virtualY; break; } invalidate(); // Convert joystick range virtualX = (float) ((128 / radius) * virtualX); virtualY = (float) ((128 / radius) * virtualY); // Convert to byte for packets xAxis = (byte) (virtualX); yAxis = (byte) (virtualY); onChange.onChange(xAxis, yAxis); return true; }
@Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mLastX = event.getX(); break; case MotionEvent.ACTION_MOVE: mCurrentX = event.getX(); mDeltX = (int) (mCurrentX - mLastX); // 如果开关开着向左滑动,或者开关关着向右滑动(这时候是不需要处理的) if ((mSwitchOn && mDeltX < 0) || (!mSwitchOn && mDeltX > 0)) { mFlag = true; mDeltX = 0; } if (Math.abs(mDeltX) > mMoveLength) { mDeltX = mDeltX > 0 ? mMoveLength : -mMoveLength; } invalidate(); return true; case MotionEvent.ACTION_UP: if (Math.abs(mDeltX) > 0 && Math.abs(mDeltX) < mMoveLength / 2) { mDeltX = 0; invalidate(); return true; } else if (Math.abs(mDeltX) > mMoveLength / 2 && Math.abs(mDeltX) <= mMoveLength) { mDeltX = mDeltX > 0 ? mMoveLength : -mMoveLength; mSwitchOn = !mSwitchOn; if (mListener != null) { mListener.onChange(this, mSwitchOn); } invalidate(); mDeltX = 0; return true; } else if (mDeltX == 0 && mFlag) { // 这时候得到的是不需要进行处理的,因为已经move过了 mDeltX = 0; mFlag = false; return true; } return super.onTouchEvent(event); default: break; } invalidate(); return super.onTouchEvent(event); }
protected void notifyListeners(String val) { if (mListener != null) { mListener.onChange(this); } }