diff options
Diffstat (limited to 'carousel/java/com/android/ex/carousel/CarouselView.java')
-rw-r--r-- | carousel/java/com/android/ex/carousel/CarouselView.java | 605 |
1 files changed, 0 insertions, 605 deletions
diff --git a/carousel/java/com/android/ex/carousel/CarouselView.java b/carousel/java/com/android/ex/carousel/CarouselView.java deleted file mode 100644 index 25c7366..0000000 --- a/carousel/java/com/android/ex/carousel/CarouselView.java +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Copyright (C) 2010 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.android.ex.carousel; - -import android.view.View; -import com.android.ex.carousel.CarouselRS.CarouselCallback; - -import android.content.Context; -import android.graphics.Bitmap; -import android.renderscript.Float4; -import android.renderscript.Mesh; -import android.renderscript.RSSurfaceView; -import android.renderscript.RenderScriptGL; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.SurfaceHolder; - -/** - * <p> - * This class represents the basic building block for using a 3D Carousel. The Carousel is - * basically a scene of cards and slots. The spacing between cards is dictated by the number - * of slots and the radius. The number of visible cards dictates how far the Carousel can be moved. - * If the number of cards exceeds the number of slots, then the Carousel will continue to go - * around until the last card can be seen. - */ -public abstract class CarouselView extends RSSurfaceView { - private static final boolean USE_DEPTH_BUFFER = true; - private static final String TAG = "CarouselView"; - private CarouselRS mRenderScript; - private RenderScriptGL mRS; - private Context mContext; - private boolean mTracking; - - CarouselController mController; - - // Drag relative to x coordinate of motion on screen - public static final int DRAG_MODEL_SCREEN_DELTA = CarouselRS.DRAG_MODEL_SCREEN_DELTA; - // Drag relative to projected point on plane of carousel - public static final int DRAG_MODEL_PLANE = CarouselRS.DRAG_MODEL_PLANE; - // Drag relative to projected point on inside (far point) of cylinder centered around carousel - public static final int DRAG_MODEL_CYLINDER_INSIDE = CarouselRS.DRAG_MODEL_CYLINDER_INSIDE; - // Drag relative to projected point on outside (near point) of cylinder centered around carousel - public static final int DRAG_MODEL_CYLINDER_OUTSIDE = CarouselRS.DRAG_MODEL_CYLINDER_OUTSIDE; - - // Draw cards counterclockwise around the carousel - public static final int FILL_DIRECTION_CCW = CarouselRS.FILL_DIRECTION_CCW; - // Draw cards clockwise around the carousel - public static final int FILL_DIRECTION_CW = CarouselRS.FILL_DIRECTION_CW; - - // Note: remember to update carousel.rs when changing the values below - public static class InterpolationMode { - /** y= x **/ - public static final int LINEAR = 0; - /** The quadratic curve y= 1 - (1 - x)^2 moves quickly towards the target - * while decelerating constantly. **/ - public static final int DECELERATE_QUADRATIC = 1; - /** The cubic curve y= (3-2x)*x^2 gradually accelerates at the origin, - * and decelerates near the target. **/ - public static final int ACCELERATE_DECELERATE_CUBIC = 2; - } - - // Note: remember to update carousel.rs when changing the values below - public static class DetailAlignment { - /** Detail is centered vertically with respect to the card **/ - public static final int CENTER_VERTICAL = 1; - /** Detail is aligned with the top edge of the carousel view **/ - public static final int VIEW_TOP = 1 << 1; - /** Detail is aligned with the bottom edge of the carousel view (not yet implemented) **/ - public static final int VIEW_BOTTOM = 1 << 2; - /** Detail is positioned above the card (not yet implemented) **/ - public static final int ABOVE = 1 << 3; - /** Detail is positioned below the card **/ - public static final int BELOW = 1 << 4; - /** Mask that selects those bits that control vertical alignment **/ - public static final int VERTICAL_ALIGNMENT_MASK = 0xff; - - /** - * Detail is centered horizontally with respect to either the top or bottom - * extent of the card, depending on whether the detail is above or below the card. - */ - public static final int CENTER_HORIZONTAL = 1 << 8; - /** - * Detail is aligned with the left edge of either the top or the bottom of - * the card, depending on whether the detail is above or below the card. - */ - public static final int LEFT = 1 << 9; - /** - * Detail is aligned with the right edge of either the top or the bottom of - * the card, depending on whether the detail is above or below the card. - * (not yet implemented) - */ - public static final int RIGHT = 1 << 10; - /** Mask that selects those bits that control horizontal alignment **/ - public static final int HORIZONTAL_ALIGNMENT_MASK = 0xff00; - } - - public static class Info { - public Info(int _resId) { resId = _resId; } - public int resId; // resource for renderscript resource (e.g. R.raw.carousel) - } - - public abstract Info getRenderScriptInfo(); - - public CarouselView(Context context) { - this(context, new CarouselController()); - } - - public CarouselView(Context context, CarouselController controller) { - this(context, null, controller); - } - - /** - * Constructor used when this widget is created from a layout file. - */ - public CarouselView(Context context, AttributeSet attrs) { - this(context, attrs, new CarouselController()); - } - - public CarouselView(Context context, AttributeSet attrs, CarouselController controller) { - super(context, attrs); - mContext = context; - mController = controller; - boolean useDepthBuffer = true; - ensureRenderScript(); - // TODO: add parameters to layout - - setOnLongClickListener(new View.OnLongClickListener() { - public boolean onLongClick(View v) { - if (interpretLongPressEvents()) { - mController.onLongPress(); - return true; - } else { - return false; - } - } - }); - } - - private void ensureRenderScript() { - if (mRS == null) { - RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); - if (USE_DEPTH_BUFFER) { - sc.setDepth(16, 24); - } - mRS = createRenderScriptGL(sc); - } - if (mRenderScript == null) { - mRenderScript = new CarouselRS(mRS, mContext.getResources(), - getRenderScriptInfo().resId); - mRenderScript.resumeRendering(); - } - mController.setRS(mRS, mRenderScript); - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - super.surfaceChanged(holder, format, w, h); - // setZOrderOnTop(true); - mController.onSurfaceChanged(); - } - - public CarouselController getController() { - return mController; - } - - public void setController(CarouselController controller) { - mController = controller; - mController.setRS(mRS, mRenderScript); - } - - /** - * Do I want to interpret the long-press gesture? If so, long-presses will cancel the - * current selection and call the appropriate callbacks. Otherwise, a long press will - * not be handled any way other than as a continued drag. - * - * @return True if we interpret long-presses - */ - public boolean interpretLongPressEvents() { - return false; - } - - /** - * Loads geometry from a resource id. - * - * @param resId - * @return the loaded mesh or null if it cannot be loaded - */ - public Mesh loadGeometry(int resId) { - return mController.loadGeometry(resId); - } - - /** - * Set the geometry for a given item. - * @param n - * @param mesh - */ - public void setGeometryForItem(int n, Mesh mesh) { - mController.setGeometryForItem(n, mesh); - } - - /** - * Set the matrix for a given item. - * @param n - * @param matrix the requested matrix; null to just use the default - */ - public void setMatrixForItem(int n, float[] matrix) { - mController.setMatrixForItem(n, matrix); - } - - /** - * Set the number of slots around the Carousel. Basically equivalent to the poles horses - * might attach to on a real Carousel. - * - * @param n the number of slots - */ - public void setSlotCount(int n) { - mController.setSlotCount(n); - } - - /** - * Sets the number of visible slots around the Carousel. This is primarily used as a cheap - * form of clipping. The Carousel will never show more than this many cards. - * @param n the number of visible slots - */ - public void setVisibleSlots(int n) { - mController.setVisibleSlots(n); - } - - /** - * Set the number of cards to pre-load that are outside of the visible region, as determined by - * setVisibleSlots(). This number gets added to the number of visible slots and used to - * determine when resources for cards should be loaded. This number should be small (n <= 4) - * for systems with limited texture memory or views that show more than half dozen cards in the - * view. - * - * @param n the number of cards; should be even, so the count is the same on each side - */ - public void setPrefetchCardCount(int n) { - mController.setPrefetchCardCount(n); - } - - /** - * Sets the number of rows of cards to show in each slot. - */ - public void setRowCount(int n) { - mController.setRowCount(n); - } - - /** - * Sets the spacing between each row of cards when rowCount > 1. - */ - public void setRowSpacing(float s) { - mController.setRowSpacing(s); - } - - /** - * Sets the position of the first card when rowCount > 1. - */ - public void setFirstCardTop(boolean f) { - mController.setFirstCardTop(f); - } - - /** - * Sets the amount of allowed overscroll (in slots) - */ - public void setOverscrollSlots(float slots) { - mController.setOverscrollSlots(slots); - } - - /** - * Set the number of detail textures that can be visible at one time. - * - * @param n the number of slots - */ - public void setVisibleDetails(int n) { - mController.setVisibleDetails(n); - } - - /** - * Sets how detail textures are aligned with respect to the card. - * - * @param alignment a bitmask of DetailAlignment flags. - */ - public void setDetailTextureAlignment(int alignment) { - mController.setDetailTextureAlignment(alignment); - } - - /** - * Set whether depth is enabled while blending. Generally, this is discouraged because - * it causes bad artifacts. Careful attention to geometry and alpha transparency of - * textures can mitigate much of this. For example, geometry for an item must be drawn - * back-to-front if any edges overlap. - * - * @param enabled True to enable depth while blending, and false to disable it. - */ - public void setForceBlendCardsWithZ(boolean enabled) { - mController.setForceBlendCardsWithZ(enabled); - } - - /** - * Set whether to draw a ruler from the card to the detail texture - * - * @param drawRuler True to draw a ruler, false to draw nothing where the ruler would go. - */ - public void setDrawRuler(boolean drawRuler) { - mController.setDrawRuler(drawRuler); - } - - /** - * This dictates how many cards are in the deck. If the number of cards is greater than the - * number of slots, then the Carousel goes around n / slot_count times. - * - * Can be called again to increase or decrease the number of cards. - * - * @param n the number of cards to create. - */ - public void createCards(int n) { - mController.createCards(n); - } - - public int getCardCount() { - return mController.getCardCount(); - } - - /** - * This sets the texture on card n. It should only be called in response to - * {@link CarouselCallback#onRequestTexture(int)}. Since there's no guarantee - * that a given texture is still on the screen, replacing this texture should be done - * by first setting it to null and then waiting for the next - * {@link CarouselCallback#onRequestTexture(int)} to swap it with the new one. - * - * @param n the card given by {@link CarouselCallback#onRequestTexture(int)} - * @param bitmap the bitmap image to show - */ - public void setTextureForItem(int n, Bitmap bitmap) { - mController.setTextureForItem(n, bitmap); - } - - /** - * This sets the detail texture that floats above card n. It should only be called in response - * to {@link CarouselCallback#onRequestDetailTexture(int)}. Since there's no guarantee - * that a given texture is still on the screen, replacing this texture should be done - * by first setting it to null and then waiting for the next - * {@link CarouselCallback#onRequestDetailTexture(int)} to swap it with the new one. - * - * @param n the card to set detail texture for - * @param offx an optional offset to apply to the texture (in pixels) from top of detail line - * @param offy an optional offset to apply to the texture (in pixels) from top of detail line - * @param loffx an optional offset to apply to the line (in pixels) from left edge of card - * @param loffy an optional offset to apply to the line (in pixels) from top of screen - * @param bitmap the bitmap to show as the detail - */ - public void setDetailTextureForItem(int n, float offx, float offy, float loffx, float loffy, - Bitmap bitmap) { - mController.setDetailTextureForItem(n, offx, offy, loffx, loffy, bitmap); - } - - /** - * Sets the bitmap to show on a card when the card draws the very first time. - * Generally, this bitmap will only be seen during the first few frames of startup - * or when the number of cards are changed. It can be ignored in most cases, - * as the cards will generally only be in the loading or loaded state. - * - * @param bitmap - */ - public void setDefaultBitmap(Bitmap bitmap) { - mController.setDefaultBitmap(bitmap); - } - - /** - * Sets the bitmap to show on the card while the texture is loading. It is set to this - * value just before {@link CarouselCallback#onRequestTexture(int)} is called and changed - * when {@link CarouselView#setTextureForItem(int, Bitmap)} is called. It is shared by all - * cards. - * - * @param bitmap - */ - public void setLoadingBitmap(Bitmap bitmap) { - mController.setLoadingBitmap(bitmap); - } - - /** - * Sets background to specified color. If a background texture is specified with - * {@link CarouselView#setBackgroundBitmap(Bitmap)}, then this call has no effect. - * - * @param red the amount of red - * @param green the amount of green - * @param blue the amount of blue - * @param alpha the amount of alpha - */ - public void setBackgroundColor(float red, float green, float blue, float alpha) { - mController.setBackgroundColor(red, green, blue, alpha); - } - - /** - * Can be used to optionally set the background to a bitmap. When set to something other than - * null, this overrides {@link CarouselView#setBackgroundColor(Float4)}. - * - * @param bitmap - */ - public void setBackgroundBitmap(Bitmap bitmap) { - mController.setBackgroundBitmap(bitmap); - } - - /** - * Can be used to optionally set a "loading" detail bitmap. Typically, this is just a black - * texture with alpha = 0 to allow details to slowly fade in. - * - * @param bitmap - */ - public void setDetailLoadingBitmap(Bitmap bitmap) { - mController.setDetailLoadingBitmap(bitmap); - } - - /** - * This texture is used to draw a line from the card alongside the texture detail. The line - * will be as wide as the texture. It can be used to give the line glow effects as well as - * allowing other blending effects. It is typically one dimensional, e.g. 3x1. - * - * @param bitmap - */ - public void setDetailLineBitmap(Bitmap bitmap) { - mController.setDetailLineBitmap(bitmap); - } - - /** - * This geometry will be shown when no geometry has been loaded for a given slot. If not set, - * a quad will be drawn in its place. It is shared for all cards. If something other than - * simple planar geometry is used, consider enabling depth test with - * {@link CarouselView#setForceBlendCardsWithZ(boolean)} - * - * @param resId - */ - public void setDefaultGeometry(int resId) { - mController.setDefaultGeometry(resId); - } - - /** - * Sets the matrix used to transform card geometries. By default, this - * is the identity matrix, but you can specify a different matrix if you - * want to scale, translate and / or rotate the card before drawing. - * - * @param matrix array of 9 or 16 floats representing a 3x3 or 4x4 matrix, - * or null as a shortcut for an identity matrix. - */ - public void setDefaultCardMatrix(float[] matrix) { - mController.setDefaultCardMatrix(matrix); - } - - /** - * This is an intermediate version of the object to show while geometry is loading. If not set, - * a quad will be drawn in its place. It is shared for all cards. If something other than - * simple planar geometry is used, consider enabling depth test with - * {@link CarouselView#setForceBlendCardsWithZ(boolean)} - * - * @param resId - */ - public void setLoadingGeometry(int resId) { - mController.setLoadingGeometry(resId); - } - - /** - * Sets the callback for receiving events from RenderScript. - * - * @param callback - */ - public void setCallback(CarouselCallback callback) - { - mController.setCallback(callback); - } - - /** - * Sets the startAngle for the Carousel. The start angle is the first position of the first - * slot draw. Cards will be drawn from this angle in a counter-clockwise manner around the - * Carousel. - * - * @param angle the angle, in radians. - */ - public void setStartAngle(float angle) - { - mController.setStartAngle(angle); - } - - public void setRadius(float radius) { - mController.setRadius(radius); - } - - public void setCardRotation(float cardRotation) { - mController.setCardRotation(cardRotation); - } - - public void setCardsFaceTangent(boolean faceTangent) { - mController.setCardsFaceTangent(faceTangent); - } - - public void setSwaySensitivity(float swaySensitivity) { - mController.setSwaySensitivity(swaySensitivity); - } - - public void setFrictionCoefficient(float frictionCoefficient) { - mController.setFrictionCoefficient(frictionCoefficient); - } - - public void setDragFactor(float dragFactor) { - mController.setDragFactor(dragFactor); - } - - public void setDragModel(int model) { - mController.setDragModel(model); - } - - public void setLookAt(float[] eye, float[] at, float[] up) { - mController.setLookAt(eye, at, up); - } - - /** - * This sets the number of cards in the distance that will be shown "rezzing in". - * These alpha values will be faded in from the background to the foreground over - * 'n' cards. A floating point value is used to allow subtly changing the rezzing in - * position. - * - * @param n the number of cards to rez in. - */ - public void setRezInCardCount(float n) { - mController.setRezInCardCount(n); - } - - /** - * This sets the duration (in ms) that a card takes to fade in when loaded via a call - * to {@link CarouselView#setTextureForItem(int, Bitmap)}. The timer starts the - * moment {@link CarouselView#setTextureForItem(int, Bitmap)} is called and continues - * until all of the cards have faded in. Note: using large values will extend the - * animation until all cards have faded in. - * - * @param t - */ - public void setFadeInDuration(long t) { - mController.setFadeInDuration(t); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mRenderScript = null; - if (mRS != null) { - mRS = null; - destroyRenderScriptGL(); - } - mController.setRS(mRS, mRenderScript); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - ensureRenderScript(); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - super.onTouchEvent(event); - final int action = event.getAction(); - - if (mRenderScript == null) { - return true; - } - - switch (action) { - case MotionEvent.ACTION_DOWN: - mTracking = true; - mController.onTouchStarted(event.getX(), event.getY(), event.getEventTime()); - break; - - case MotionEvent.ACTION_MOVE: - if (mTracking) { - for (int i = 0; i < event.getHistorySize(); i++) { - mController.onTouchMoved(event.getHistoricalX(i), event.getHistoricalY(i), - event.getHistoricalEventTime(i)); - } - mController.onTouchMoved(event.getX(), event.getY(), event.getEventTime()); - } - break; - - case MotionEvent.ACTION_UP: - mController.onTouchStopped(event.getX(), event.getY(), event.getEventTime()); - mTracking = false; - break; - } - - return true; - } -} |