List of usage examples for android.graphics.drawable Drawable getCurrent
public @NonNull Drawable getCurrent()
From source file:com.anysoftkeyboard.keyboards.views.AnyKeyboardBaseView.java
private void onBufferDraw(Canvas canvas) { if (mKeyboardChanged) { invalidateAllKeys();//w w w.ja v a 2s . c o m mKeyboardChanged = false; } canvas.getClipBounds(mDirtyRect); if (mKeyboard == null) return; final boolean drawKeyboardNameText = (mKeyboardNameTextSize > 1f) && AnyApplication.getConfig().getShowKeyboardNameText(); final boolean drawHintText = (mHintTextSize > 1) && AnyApplication.getConfig().getShowHintTextOnKeys(); // TODO: calls to AnyApplication.getConfig().getXXXXX() functions are // not yet implemented, // but need to when allowing preferences to override theme settings of // these values // right now just using what should be the default values for these // unimplemented preferences final boolean useCustomKeyTextColor = false; // TODO: final boolean useCustomKeyTextColor = // AnyApplication.getConfig().getUseCustomTextColorOnKeys(); final ColorStateList keyTextColor = useCustomKeyTextColor ? new ColorStateList(new int[][] { { 0 } }, new int[] { 0xFF6666FF }) : mKeyTextColor; // TODO: ? AnyApplication.getConfig().getCustomKeyTextColorOnKeys() : // mKeyTextColor; final boolean useCustomHintColor = drawHintText && false; // TODO: final boolean useCustomHintColor = drawHintText && // AnyApplication.getConfig().getUseCustomHintColorOnKeys(); final ColorStateList hintColor = useCustomHintColor ? new ColorStateList(new int[][] { { 0 } }, new int[] { 0xFFFF6666 }) : mHintTextColor; // TODO: ? AnyApplication.getConfig().getCustomHintColorOnKeys() : // mHintTextColor; // allow preferences to override theme settings for hint text position final boolean useCustomHintAlign = drawHintText && AnyApplication.getConfig().getUseCustomHintAlign(); final int hintAlign = useCustomHintAlign ? AnyApplication.getConfig().getCustomHintAlign() : mHintLabelAlign; final int hintVAlign = useCustomHintAlign ? AnyApplication.getConfig().getCustomHintVAlign() : mHintLabelVAlign; final Paint paint = mPaint; final Drawable keyBackground = mKeyBackground; final Rect clipRegion = mClipRegion; final int kbdPaddingLeft = getPaddingLeft(); final int kbdPaddingTop = getPaddingTop(); final Key[] keys = mKeys; final Key invalidKey = mInvalidatedKey; boolean drawSingleKey = false; if (invalidKey != null && canvas.getClipBounds(clipRegion)) { // TODO we should use Rect.inset and Rect.contains here. // Is clipRegion completely contained within the invalidated key? if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { drawSingleKey = true; } } final int keyCount = keys.length; for (int i = 0; i < keyCount; i++) { final AnyKey key = (AnyKey) keys[i]; final boolean keyIsSpace = isSpaceKey(key); if (drawSingleKey && (invalidKey != key)) { continue; } if (!mDirtyRect.intersects(key.x + kbdPaddingLeft, key.y + kbdPaddingTop, key.x + key.width + kbdPaddingLeft, key.y + key.height + kbdPaddingTop)) { continue; } int[] drawableState = key.getCurrentDrawableState(mDrawableStatesProvider); if (keyIsSpace) paint.setColor(mKeyboardNameTextColor.getColorForState(drawableState, 0xFF000000)); else paint.setColor(keyTextColor.getColorForState(drawableState, 0xFF000000)); keyBackground.setState(drawableState); // Switch the character to uppercase if shift is pressed CharSequence label = key.label == null ? null : adjustCase(key).toString(); final Rect bounds = keyBackground.getBounds(); if ((key.width != bounds.right) || (key.height != bounds.bottom)) { keyBackground.setBounds(0, 0, key.width, key.height); } canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); keyBackground.draw(canvas); if (TextUtils.isEmpty(label)) { Drawable iconToDraw = getIconToDrawForKey(key, false); if (iconToDraw != null/* && shouldDrawIcon */) { //http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getCurrent() //http://stackoverflow.com/a/103600/1324235 final boolean is9Patch = iconToDraw.getCurrent() instanceof NinePatchDrawable; // Special handing for the upper-right number hint icons final int drawableWidth; final int drawableHeight; final int drawableX; final int drawableY; drawableWidth = is9Patch ? key.width : iconToDraw.getIntrinsicWidth(); drawableHeight = is9Patch ? key.height : iconToDraw.getIntrinsicHeight(); drawableX = (key.width + mKeyBackgroundPadding.left - mKeyBackgroundPadding.right - drawableWidth) / 2; drawableY = (key.height + mKeyBackgroundPadding.top - mKeyBackgroundPadding.bottom - drawableHeight) / 2; canvas.translate(drawableX, drawableY); iconToDraw.setBounds(0, 0, drawableWidth, drawableHeight); iconToDraw.draw(canvas); canvas.translate(-drawableX, -drawableY); if (keyIsSpace && drawKeyboardNameText) { // now a little hack, I'll set the label now, so it get // drawn. label = mKeyboardName; } } else { // ho... no icon. // I'll try to guess the text label = guessLabelForKey(key.codes[0]); if (TextUtils.isEmpty(label)) { Log.w(TAG, "That's unfortunate, for key " + key.codes[0] + " at (" + key.x + ", " + key.y + ") there is no icon nor label. Action ID is " + mKeyboardActionType); } } } if (label != null) { // For characters, use large font. For labels like "Done", use // small font. final FontMetrics fm; if (keyIsSpace) { paint.setTextSize(mKeyboardNameTextSize); paint.setTypeface(Typeface.DEFAULT_BOLD); if (mKeyboardNameFM == null) mKeyboardNameFM = paint.getFontMetrics(); fm = mKeyboardNameFM; } else if (label.length() > 1 && key.codes.length < 2) { paint.setTextSize(mLabelTextSize); paint.setTypeface(Typeface.DEFAULT_BOLD); if (mLabelFM == null) mLabelFM = paint.getFontMetrics(); fm = mLabelFM; } else { fm = setPaintToKeyText(paint); } final float labelHeight = -fm.top; // Draw a drop shadow for the text paint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mShadowColor); // (+)This is the trick to get RTL/LTR text correct // no matter what: StaticLayout // this should be in the top left corner of the key float textWidth = paint.measureText(label, 0, label.length()); // I'm going to try something if the key is too small for the // text: // 1) divide the text size by 1.5 // 2) if still too large, divide by 2.5 // 3) show no text if (textWidth > key.width) { Log.d(TAG, "Label '" + label + "' is too large for the key. Reducing by 1.5."); paint.setTextSize(mKeyTextSize / 1.5f); textWidth = paint.measureText(label, 0, label.length()); if (textWidth > key.width) { Log.d(TAG, "Label '" + label + "' is too large for the key. Reducing by 2.5."); paint.setTextSize(mKeyTextSize / 2.5f); textWidth = paint.measureText(label, 0, label.length()); if (textWidth > key.width) { Log.d(TAG, "Label '" + label + "' is too large for the key. Showing no text."); paint.setTextSize(0f); textWidth = paint.measureText(label, 0, label.length()); } } } // the center of the drawable space, which is value used // previously for vertically // positioning the key label final float centerY = mKeyBackgroundPadding.top + ((key.height - mKeyBackgroundPadding.top - mKeyBackgroundPadding.bottom) / (keyIsSpace ? 3 : 2));// the label on the space is a bit higher // the X coordinate for the center of the main label text is // unaffected by the hints final float centerX = mKeyBackgroundPadding.left + (key.width - mKeyBackgroundPadding.left - mKeyBackgroundPadding.right) / 2; final float textX = centerX; final float textY; // Some devices (mostly pre-Honeycomb, have issues with RTL text // drawing. // Of course, there is no issue with a single character :) // so, we'll use the RTL secured drawing (via StaticLayout) for // labels. if (label.length() > 1 && !AnyApplication.getConfig().workaround_alwaysUseDrawText()) { // calculate Y coordinate of top of text based on center // location textY = centerY - ((labelHeight - paint.descent()) / 2); canvas.translate(textX, textY); Log.d(TAG, "Using RTL fix for key draw '" + label + "'"); // RTL fix. But it costs, let do it when in need (more than // 1 character) StaticLayout labelText = new StaticLayout(label, new TextPaint(paint), (int) textWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); labelText.draw(canvas); } else { // to get Y coordinate of baseline from center of text, // first add half the height (to get to // bottom of text), then subtract the part below the // baseline. Note that fm.top is negative. textY = centerY + ((labelHeight - paint.descent()) / 2); canvas.translate(textX, textY); canvas.drawText(label, 0, label.length(), 0, 0, paint); } canvas.translate(-textX, -textY); // (-) // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); } if (drawHintText) { if ((key.popupCharacters != null && key.popupCharacters.length() > 0) || (key.popupResId != 0) || (key.longPressCode != 0)) { Paint.Align oldAlign = paint.getTextAlign(); String hintText = null; if (key.hintLabel != null && key.hintLabel.length() > 0) { hintText = key.hintLabel.toString(); // it is the responsibility of the keyboard layout // designer to ensure that they do // not put too many characters in the hint label... } else if (key.longPressCode != 0) { if (Character.isLetterOrDigit(key.longPressCode)) hintText = Character.toString((char) key.longPressCode); } else if (key.popupCharacters != null) { final String hintString = key.popupCharacters.toString(); final int hintLength = hintString.length(); if (hintLength <= 3) hintText = hintString; } // if hintText is still null, it means it didn't fit one of // the above // cases, so we should provide the hint using the default if (hintText == null) { if (mHintOverflowLabel != null) hintText = mHintOverflowLabel.toString(); else { // theme does not provide a defaultHintLabel // use if hints are above, ... if hints are // below // (to avoid being too close to main label/icon) if (hintVAlign == Gravity.TOP) hintText = ""; else hintText = "..."; } } if (mKeyboard.isShifted()) hintText = hintText.toUpperCase(); // now draw hint paint.setTypeface(Typeface.DEFAULT); paint.setColor(hintColor.getColorForState(drawableState, 0xFF000000)); paint.setTextSize(mHintTextSize); // get the hint text font metrics so that we know the size // of the hint when // we try to position the main label (to try to make sure // they don't overlap) if (mHintTextFM == null) { mHintTextFM = paint.getFontMetrics(); } final float hintX; final float hintY; // the (float) 0.5 value is added or subtracted to just give // a little more room // in case the theme designer didn't account for the hint // label location if (hintAlign == Gravity.LEFT) { // left paint.setTextAlign(Paint.Align.LEFT); hintX = mKeyBackgroundPadding.left + (float) 0.5; } else if (hintAlign == Gravity.CENTER) { // center paint.setTextAlign(Paint.Align.CENTER); hintX = mKeyBackgroundPadding.left + (key.width - mKeyBackgroundPadding.left - mKeyBackgroundPadding.right) / 2; } else { // right paint.setTextAlign(Paint.Align.RIGHT); hintX = key.width - mKeyBackgroundPadding.right - (float) 0.5; } if (hintVAlign == Gravity.TOP) { // above hintY = mKeyBackgroundPadding.top - mHintTextFM.top + (float) 0.5; } else { // below hintY = key.height - mKeyBackgroundPadding.bottom - mHintTextFM.bottom - (float) 0.5; } canvas.drawText(hintText, hintX, hintY, paint); paint.setTextAlign(oldAlign); } } canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); } mInvalidatedKey = null; // Overlay a dark rectangle to dim the keyboard if (mMiniKeyboard != null && mMiniKeyboardVisible) { paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } if (FeaturesSet.DEBUG_LOG) { if (mShowTouchPoints) { for (PointerTracker tracker : mPointerTrackers) { int startX = tracker.getStartX(); int startY = tracker.getStartY(); int lastX = tracker.getLastX(); int lastY = tracker.getLastY(); paint.setAlpha(128); paint.setColor(0xFFFF0000); canvas.drawCircle(startX, startY, 3, paint); canvas.drawLine(startX, startY, lastX, lastY, paint); paint.setColor(0xFF0000FF); canvas.drawCircle(lastX, lastY, 3, paint); paint.setColor(0xFF00FF00); canvas.drawCircle((startX + lastX) / 2, (startY + lastY) / 2, 2, paint); } } } mDrawPending = false; mDirtyRect.setEmpty(); }
From source file:edu.usf.cutr.opentripplanner.android.fragments.MainFragment.java
/** * Draws the route on the map.// ww w. j av a2 s.c om * <p> * To indicate the full route a polyline will be drawn using all points in * itinerary. * <p> * On each method of transportation change a mode marker will be added. * <p> * Mode marker for transit step will display stop name, departure time and * headsign. * Mode marker for walk/bike connection, guidance to next point and distance and time * to get there. * <p> * Previous routes are removed from the map. * * @param itinerary the information to be drawn * @param animateCamera if true map will be zoomed to exactly fit the route * after the drawing */ public void showRouteOnMap(List<Leg> itinerary, boolean animateCamera) { Log.v(OTPApp.TAG, "(TripRequest) legs size = " + Integer.toString(itinerary.size())); if (mRoute != null) { for (Polyline legLine : mRoute) { legLine.remove(); } mRoute.clear(); } if (mModeMarkers != null) { for (Marker modeMarker : mModeMarkers) { modeMarker.remove(); } } mRoute = new ArrayList<Polyline>(); mModeMarkers = new ArrayList<Marker>(); Marker firstTransitMarker = null; if (!itinerary.isEmpty()) { LatLngBounds.Builder boundsCreator = LatLngBounds.builder(); int stepIndex = 0; for (Leg leg : itinerary) { stepIndex++; List<LatLng> points = LocationUtil.decodePoly(leg.legGeometry.getPoints()); MarkerOptions modeMarkerOption = new MarkerOptions().position(points.get(0)); float scaleFactor = getResources().getFraction(R.fraction.scaleFactor, 1, 1); Drawable drawable = getResources().getDrawable(getPathIcon(leg.mode)); if (drawable != null) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable.getCurrent(); Bitmap bitmap = bitmapDrawable.getBitmap(); Bitmap bitmapHalfSize = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() / scaleFactor), (int) (bitmap.getHeight() / scaleFactor), false); modeMarkerOption.icon(BitmapDescriptorFactory.fromBitmap(bitmapHalfSize)); } else { Log.e(OTPApp.TAG, "Error obtaining drawable to add mode icons to the map"); } TraverseMode traverseMode = TraverseMode.valueOf(leg.mode); if (traverseMode.isTransit()) { modeMarkerOption.title(stepIndex + ". " + ConversionUtils.getRouteShortNameSafe(leg.getRouteShortName(), leg.getRouteLongName(), mApplicationContext) + " " + getResources().getString(R.string.map_markers_connector_before_stop) + " " + DirectionsGenerator.getLocalizedStreetName(leg.getFrom().name, mApplicationContext.getResources())); String modeMarkerSnippet = ConversionUtils.getTimeWithContext(mApplicationContext, leg.getAgencyTimeZoneOffset(), Long.parseLong(leg.getStartTime()), false); if (leg.getHeadsign() != null) { modeMarkerSnippet += " " + getResources().getString(R.string.step_by_step_non_transit_to) + " " + leg.getHeadsign(); } modeMarkerOption.snippet(modeMarkerSnippet); } else { if (traverseMode.equals(TraverseMode.WALK)) { modeMarkerOption.title(stepIndex + ". " + getResources().getString(R.string.map_markers_mode_walk_action) + " " + getResources().getString(R.string.map_markers_connector_before_destination) + " " + DirectionsGenerator.getLocalizedStreetName(leg.getTo().name, mApplicationContext.getResources())); } else if (traverseMode.equals(TraverseMode.BICYCLE)) { modeMarkerOption.title(stepIndex + ". " + getResources().getString(R.string.map_markers_mode_bicycle_action) + " " + getResources().getString(R.string.map_markers_connector_before_destination) + " " + DirectionsGenerator.getLocalizedStreetName(leg.getTo().name, mApplicationContext.getResources())); } modeMarkerOption.snippet(ConversionUtils.getFormattedDurationTextNoSeconds(leg.duration / 1000, mApplicationContext) + " " + "-" + " " + ConversionUtils.getFormattedDistance(leg.getDistance(), mApplicationContext)); } Marker modeMarker = mMap.addMarker(modeMarkerOption); mModeMarkers.add(modeMarker); if (traverseMode.isTransit()) { //because on transit two step-by-step indications are generated (get on / get off) stepIndex++; if (firstTransitMarker == null) { firstTransitMarker = modeMarker; firstTransitMarker.showInfoWindow(); } } PolylineOptions options = new PolylineOptions().addAll(points).width(5 * scaleFactor) .color(OTPApp.COLOR_ROUTE_LINE); Polyline routeLine = mMap.addPolyline(options); mRoute.add(routeLine); for (LatLng point : points) { boundsCreator.include(point); } } if (animateCamera) { mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(boundsCreator.build(), getResources().getInteger(R.integer.default_padding))); } } }
From source file:com.appunite.list.AbsHorizontalListView.java
/** * Sets the selector state to "pressed" and posts a CheckForKeyLongPress to see if * this is a long press.//w w w .java 2s.c o m */ void keyPressed() { if (!isEnabled() || !isClickable()) { return; } Drawable selector = mSelector; Rect selectorRect = mSelectorRect; if (selector != null && (isFocused() || touchModeDrawsInPressedState()) && !selectorRect.isEmpty()) { final View v = getChildAt(mSelectedPosition - mFirstPosition); if (v != null) { if (v.hasFocusable()) return; v.setPressed(true); } setPressed(true); final boolean longClickable = isLongClickable(); Drawable d = selector.getCurrent(); if (d != null && d instanceof TransitionDrawable) { if (longClickable) { ((TransitionDrawable) d).startTransition(ViewConfiguration.getLongPressTimeout()); } else { ((TransitionDrawable) d).resetTransition(); } } if (longClickable && !mDataChanged) { if (mPendingCheckForKeyLongPress == null) { mPendingCheckForKeyLongPress = new CheckForKeyLongPress(); } mPendingCheckForKeyLongPress.rememberWindowAttachCount(); postDelayed(mPendingCheckForKeyLongPress, ViewConfiguration.getLongPressTimeout()); } } }
From source file:com.aliasapps.seq.scroller.TwoWayView.java
/** * Sets the selector state to "pressed" and posts a CheckForKeyLongPress to see if * this is a long press.// www .ja v a 2 s . c o m */ private void keyPressed() { if (!isEnabled() || !isClickable()) { return; } final Drawable selector = mSelector; final Rect selectorRect = mSelectorRect; if (selector != null && (isFocused() || touchModeDrawsInPressedState()) && !selectorRect.isEmpty()) { final View child = getChildAt(mSelectedPosition - mFirstPosition); if (child != null) { if (child.hasFocusable()) { return; } child.setPressed(true); } setPressed(true); final boolean longClickable = isLongClickable(); final Drawable d = selector.getCurrent(); if (d != null && d instanceof TransitionDrawable) { if (longClickable) { ((TransitionDrawable) d).startTransition(ViewConfiguration.getLongPressTimeout()); } else { ((TransitionDrawable) d).resetTransition(); } } if (longClickable && !mDataChanged) { if (mPendingCheckForKeyLongPress == null) { mPendingCheckForKeyLongPress = new CheckForKeyLongPress(); } mPendingCheckForKeyLongPress.rememberWindowAttachCount(); postDelayed(mPendingCheckForKeyLongPress, ViewConfiguration.getLongPressTimeout()); } } }