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;
 }
示例#3
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);
  }
示例#5
0
 protected void notifyListeners(String val) {
   if (mListener != null) {
     mListener.onChange(this);
   }
 }