HeaderElevationController(View header) { mHeader = header; final Resources res = mHeader.getContext().getResources(); mMaxElevation = res.getDimension(R.dimen.all_apps_header_max_elevation); mScrollToElevation = res.getDimension(R.dimen.all_apps_header_scroll_to_elevation); // We need to provide a custom outline so the shadow only appears on the bottom edge. // The top, left and right edges are all extended out, and the shadow is clipped // by the parent. final ViewOutlineProvider vop = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { final View parent = (View) mHeader.getParent(); final int left = parent.getLeft(); // Use the parent to account for offsets final int top = view.getTop(); final int right = left + view.getWidth(); final int bottom = view.getBottom(); final int offset = Utilities.pxFromDp(mMaxElevation, res.getDisplayMetrics()); outline.setRect(left - offset, top - offset, right + offset, bottom); } }; mHeader.setOutlineProvider(vop); }
@Override protected void onSizeChanged(final int w, final int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mDrawable.setBounds(0, 0, w, h); mWidth = w; mHeight = h; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setOutlineProvider(new ViewOutlineProvider() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); } }
private void initView(AttributeSet attrs) { edgePaint.setColor(DEFAULT_EDGE_COLOR); edgePaint.setAntiAlias(true); if (attrs != null) { TypedArray arr = getContext().obtainStyledAttributes(attrs, R.styleable.DepthView); edgePaint.setColor(arr.getInt(R.styleable.DepthView_edge_color, DEFAULT_EDGE_COLOR)); setIsCircle(arr.getBoolean(R.styleable.DepthView_is_circle, false)); depth = arr.getDimension(R.styleable.DepthView_depth, DEFAULT_THICKNESS * getResources().getDisplayMetrics().density); customShadowElevation = arr.getDimension(R.styleable.DepthView_custom_elevation, 0); } else { edgePaint.setColor(DEFAULT_EDGE_COLOR); depth = DEFAULT_THICKNESS * getResources().getDisplayMetrics().density; } setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { } }); }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{-android.R.attr.state_enabled}, createCircleDrawable(mColorDisabled)); drawable.addState(new int[]{android.R.attr.state_pressed}, createCircleDrawable(mColorPressed)); drawable.addState(new int[]{}, createCircleDrawable(mColorNormal)); if (Util.hasLollipop()) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][]{{}}, new int[]{mColorRipple}), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{android.R.attr.state_pressed}, createRectDrawable(mColorPressed)); drawable.addState(new int[]{}, createRectDrawable(mColorNormal)); if (Util.hasLollipop()) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][]{{}}, new int[]{mColorRipple}), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
private void initView(AttributeSet attrs) { setLayerType(LAYER_TYPE_HARDWARE, null); edgePaint.setColor(DEFAULT_EDGE_COLOR); edgePaint.setAntiAlias(true); if (attrs != null) { TypedArray arr = getContext().obtainStyledAttributes(attrs, R.styleable.DepthRelativeLayout); edgePaint.setColor(arr.getInt(R.styleable.DepthRelativeLayout_depth_edgeColor, DEFAULT_EDGE_COLOR)); setIsCircle(arr.getBoolean(R.styleable.DepthRelativeLayout_depth_isCircle, false)); depth = arr.getDimension(R.styleable.DepthRelativeLayout_depth_value, DEFAULT_THICKNESS * getResources().getDisplayMetrics().density); depthIndex = arr.getInteger(R.styleable.DepthRelativeLayout_depth_zIndex, depthIndex); animationDelay = arr.getInteger(R.styleable.DepthRelativeLayout_depth_animationDelay, animationDelay); customShadowElevation = arr.getDimension(R.styleable.DepthRelativeLayout_depth_elevation, 0); } else { edgePaint.setColor(DEFAULT_EDGE_COLOR); depth = DEFAULT_THICKNESS * getResources().getDisplayMetrics().density; } setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { } }); }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public ViewOutlineProvider getOutlineProvider() { shadowpath = new Path(); if (config.getRadius() == 0) { shadowpath = path; } else { rect = new Rect(0, 0, (int) width, (int) height); RectF r = new RectF(rect); shadowpath.addRoundRect(r, config.getRadius(), config.getRadius(), Path.Direction.CCW); shadowpath.op(path, shadowpath, Path.Op.INTERSECT); } return new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { if (path.isConvex()) { outline.setConvexPath(shadowpath); } } }; }
private void initialize() { borderPath = new Path(); oval = new RectF(); borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); borderPaint.setStyle(Paint.Style.STROKE); // ViewOutlineProvider does not support clipping customized path if (canUseViewOutlineProvider()) { ViewOutlineProvider provider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { if (canUseViewOutlineProvider()) { float radius = Math.max(0, cornerRadius); outline.setRoundRect(0, 0, getWidth(), getHeight(), radius); } } }; setOutlineProvider(provider); setClipToOutline(true); } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{-android.R.attr.state_enabled}, createCircleDrawable(mColorDisabled)); drawable.addState(new int[]{android.R.attr.state_pressed}, createCircleDrawable(mColorPressed)); drawable.addState(new int[]{}, createCircleDrawable(mColorNormal)); if (!isInEditMode() && Util.hasLollipop()) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][]{{}}, new int[]{mColorRipple}), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[] {android.R.attr.state_pressed}, createRectDrawable(mColorPressed) ); drawable.addState(new int[] {}, createRectDrawable(mColorNormal)); if(Util.hasLollipop() && mUsingRipple) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][] {{}}, new int[] {mColorRipple} ), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
private void initOutlineProvider() { if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { setOutlineProvider( new ViewOutlineProvider() { @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void getOutline(View view, Outline outline) { if (chipDrawable != null) { chipDrawable.getOutline(outline); } else { outline.setAlpha(0.0f); } } }); } }
private void initialize() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setOutlineProvider(new ViewOutlineProvider() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { outline.setOval( view.getPaddingLeft(), view.getPaddingTop(), view.getWidth() - view.getPaddingRight(), view.getHeight() - view.getPaddingBottom()); } }); setClipToOutline(true); } }
private void calculateLayout() { if (settings == null) { return; } height = getMeasuredHeight(); width = getMeasuredWidth(); if (width > 0 && height > 0) { clipPath = createClipPath(); ViewCompat.setElevation(this, settings.getElevation()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !settings.isCropInside()) { ViewCompat.setElevation(this, settings.getElevation()); setOutlineProvider(new ViewOutlineProvider() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { outline.setConvexPath(clipPath); } }); } } }
/** * Populates <code>outline</code> with the first available (non-empty) layer outline. * * @param outline Outline in which to place the first available layer outline */ @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void getOutline(@NonNull Outline outline) { final ChildDrawable[] array = mLayerState.mChildren; final int N = mLayerState.mNum; for (int i = 0; i < N; i++) { final Drawable dr = array[i].mDrawable; if (dr != null) { dr.getOutline(outline); if (!outline.isEmpty()) { return; } } } }
public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); setClickable(true); // Set the outline provider for this view. The provider is given the outline which it can // then modify as needed. In this case we set the outline to be an oval fitting the height // and width. setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, getWidth(), getHeight()); } }); // Finally, enable clipping to the outline, using the provider we set above setClipToOutline(true); }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{android.R.attr.state_pressed}, createCircleDrawable(mColorPressed)); drawable.addState(new int[]{}, createCircleDrawable(mColorNormal)); if (Util.hasLollipop()) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][]{{}}, new int[]{mColorRipple}), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private Drawable createFillDrawable() { StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{android.R.attr.state_pressed}, createRectDrawable(mColorPressed)); drawable.addState(new int[]{}, createRectDrawable(mColorNormal)); if (hasLollipop()) { RippleDrawable ripple = new RippleDrawable(new ColorStateList(new int[][]{{}}, new int[]{mColorRipple}), drawable, null); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); mBackgroundDrawable = ripple; return ripple; } mBackgroundDrawable = drawable; return drawable; }
@Override protected void onSizeChanged(final int w, final int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mDrawable.setBounds(0, 0, w, h); mBounds.set(0, 0, w, h); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setOutlineProvider(new ViewOutlineProvider() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); } }
private void init() { setWillNotDraw(false); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mPath = new Path(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mViewOutlineProvider = new ViewOutlineProvider() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { if (mPath.isConvex()) outline.setConvexPath(mPath); } }; } }
/** * Constructor. * @param context the application context. * @param attrs attributes. * @param defStyleAttr attribute in the current theme that contains a * reference to a style resource that supplies defaults * values for the StyledAttributes * @param defStyleRes a resource identifier of a style resource that * supplies default values for the StyledAttributes, * used only if defStyleAttr is 0 or can not be found * in the theme */ public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); setClickable(true); // Set the outline provider for this view. The provider is given the // outline which it can then modify as needed. In this case we set the // outline to be an oval fitting the height and width. setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, getWidth(), getHeight()); } }); // Finally, enable clipping to the outline, using the provider we set // above setClipToOutline(true); }