protected void notifyObservers(final T model) { synchronized (listeners) { for (OnChangeListener<T> listener : listeners) { listener.onChange(model); } } }
/** * Reset the lightweight theme. Note: This should be called on the UI thread to restrict accessing * the bitmap to a single thread. */ private void resetLightweightTheme() { ThreadUtils.assertOnUiThread(AssertBehavior.NONE); if (mBitmap == null) { return; } // Reset the bitmap. mBitmap = null; for (OnChangeListener listener : mListeners) { listener.onLightweightThemeReset(); } }
@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); } }
public void remGroupFromTrainingFeed(TrainingFeed trainingFeed, Groups group) { trainingFeed.deleteGroup(group); if (listener != null) { listener.onGroupRemoved(trainingFeed); } }
public void change(T value) { for (OnChangeListener<T> listener : listeners) listener.change(value); }
/** * Set a new lightweight theme with the given bitmap. Note: This should be called on the UI thread * to restrict accessing the bitmap to a single thread. * * @param bitmap The bitmap used for the lightweight theme. * @param color The background/accent color used for the lightweight theme. */ private void setLightweightTheme(Bitmap bitmap, String color) { if (bitmap == null || bitmap.getWidth() == 0 || bitmap.getHeight() == 0) { mBitmap = null; return; } // Get the max display dimension so we can crop or expand the theme. final int maxWidth = WindowUtils.getLargestDimension(mApplication); // The lightweight theme image's width and height. final int bitmapWidth = bitmap.getWidth(); final int bitmapHeight = bitmap.getHeight(); try { mColor = Color.parseColor(color); } catch (Exception e) { // Malformed or missing color. // Default to TRANSPARENT. mColor = Color.TRANSPARENT; } // Calculate the luminance to determine if it's a light or a dark theme. double luminance = (0.2125 * ((mColor & 0x00FF0000) >> 16)) + (0.7154 * ((mColor & 0x0000FF00) >> 8)) + (0.0721 * (mColor & 0x000000FF)); mIsLight = luminance > 110; // The bitmap image might be smaller than the device's width. // If it's smaller, fill the extra space on the left with the dominant color. if (bitmapWidth >= maxWidth) { mBitmap = Bitmap.createBitmap(bitmap, bitmapWidth - maxWidth, 0, maxWidth, bitmapHeight); } else { Paint paint = new Paint(); paint.setAntiAlias(true); // Create a bigger image that can fill the device width. // By creating a canvas for the bitmap, anything drawn on the canvas // will be drawn on the bitmap. mBitmap = Bitmap.createBitmap(maxWidth, bitmapHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(mBitmap); // Fill the canvas with dominant color. canvas.drawColor(mColor); // The image should be top-right aligned. Rect rect = new Rect(); Gravity.apply( Gravity.TOP | Gravity.RIGHT, bitmapWidth, bitmapHeight, new Rect(0, 0, maxWidth, bitmapHeight), rect); // Draw the bitmap. canvas.drawBitmap(bitmap, null, rect, paint); } for (OnChangeListener listener : mListeners) { listener.onLightweightThemeChanged(); } }