summaryrefslogtreecommitdiff
path: root/samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java')
-rw-r--r--samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java b/samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java
new file mode 100644
index 000000000..b3bc96180
--- /dev/null
+++ b/samples/devbytes/animation/ActivityAnimations/src/com/example/android/activityanim/ShadowLayout.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.activityanim;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BlurMaskFilter;
+import android.graphics.BlurMaskFilter.Blur;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+/**
+ * This custom layout paints a drop shadow behind all children. The size and opacity
+ * of the drop shadow is determined by a "depth" factor that can be set and animated.
+ */
+public class ShadowLayout extends RelativeLayout {
+
+ Paint mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ float mShadowDepth;
+ Bitmap mShadowBitmap;
+ static final int BLUR_RADIUS = 6;
+ static final RectF sShadowRectF = new RectF(0, 0, 200, 200);
+ static final Rect sShadowRect = new Rect(0, 0, 200 + 2 * BLUR_RADIUS, 200 + 2 * BLUR_RADIUS);
+ static RectF tempShadowRectF = new RectF(0, 0, 0, 0);
+
+ public ShadowLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init();
+ }
+
+ public ShadowLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public ShadowLayout(Context context) {
+ super(context);
+ init();
+ }
+
+ /**
+ * Called by the constructors - sets up the drawing parameters for the drop shadow.
+ */
+ private void init() {
+ mShadowPaint.setColor(Color.BLACK);
+ mShadowPaint.setStyle(Style.FILL);
+ setWillNotDraw(false);
+ mShadowBitmap = Bitmap.createBitmap(sShadowRect.width(),
+ sShadowRect.height(), Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas(mShadowBitmap);
+ mShadowPaint.setMaskFilter(new BlurMaskFilter(BLUR_RADIUS, Blur.NORMAL));
+ c.translate(BLUR_RADIUS, BLUR_RADIUS);
+ c.drawRoundRect(sShadowRectF, sShadowRectF.width() / 40,
+ sShadowRectF.height() / 40, mShadowPaint);
+ }
+
+ /**
+ * The "depth" factor determines the offset distance and opacity of the shadow (shadows that
+ * are further away from the source are offset greater and are more translucent).
+ * @param depth
+ */
+ public void setShadowDepth(float depth) {
+ if (depth != mShadowDepth) {
+ mShadowDepth = depth;
+ mShadowPaint.setAlpha((int) (100 + 150 * (1 - mShadowDepth)));
+ invalidate(); // We need to redraw when the shadow attributes change
+ }
+ }
+
+ /**
+ * Overriding onDraw allows us to draw shadows behind every child of this container.
+ * onDraw() is called to draw a layout's content before the children are drawn, so the
+ * shadows will be drawn first, behind the children (which is what we want).
+ */
+ @Override
+ protected void onDraw(Canvas canvas) {
+ for (int i = 0; i < getChildCount(); ++i) {
+ View child = getChildAt(i);
+ if (child.getVisibility() != View.VISIBLE || child.getAlpha() == 0) {
+ continue;
+ }
+ int depthFactor = (int) (80 * mShadowDepth);
+ canvas.save();
+ canvas.translate(child.getLeft() + depthFactor,
+ child.getTop() + depthFactor);
+ canvas.concat(child.getMatrix());
+ tempShadowRectF.right = child.getWidth();
+ tempShadowRectF.bottom = child.getHeight();
+ canvas.drawBitmap(mShadowBitmap, sShadowRect, tempShadowRectF, mShadowPaint);
+ canvas.restore();
+ }
+ }
+
+
+}