| /* |
| * 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 com.android.ex.carousel.CarouselRS.CarouselCallback; |
| import com.android.ex.carousel.CarouselView.DetailAlignment; |
| |
| import android.graphics.Bitmap; |
| import android.renderscript.Float4; |
| import android.renderscript.Mesh; |
| import android.renderscript.RenderScriptGL; |
| import android.util.Log; |
| |
| /** |
| * <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 class CarouselController { |
| private final int DEFAULT_SLOT_COUNT = 10; |
| private final float DEFAULT_RADIUS = 20.0f; |
| private final int DEFAULT_VISIBLE_DETAIL_COUNT = 3; |
| private final int DEFAULT_PREFETCH_CARD_COUNT = 2; |
| private final int DEFAULT_ROW_COUNT = 1; |
| private final float DEFAULT_OVERSCROLL_SLOTS = 1.0f; |
| private final float DEFAULT_ROW_SPACING = 0.0f; |
| private final float DEFAULT_SWAY_SENSITIVITY = 0.0f; |
| private final float DEFAULT_FRICTION_COEFFICIENT = 10.0f; |
| private final float DEFAULT_DRAG_FACTOR = 0.25f; |
| private final int DEFAULT_DETAIL_ALIGNMENT = |
| DetailAlignment.VIEW_TOP | DetailAlignment.LEFT; |
| private CarouselRS mRenderScript; |
| private RenderScriptGL mRS; |
| private static final String TAG = "CarouselController"; |
| private static final boolean DBG = false; |
| |
| // These shadow the state of the renderer in case the surface changes so the surface |
| // can be restored to its previous state. |
| private Bitmap mDefaultBitmap; |
| private Bitmap mLoadingBitmap; |
| private Bitmap mBackgroundBitmap; |
| private Bitmap mDefaultLineBitmap = Bitmap.createBitmap( |
| new int[] {0x00000000, 0xffffffff, 0x00000000}, 0, 3, 3, 1, Bitmap.Config.ARGB_4444); |
| private int mDefaultGeometry; |
| private int mLoadingGeometry; |
| private float[] mDefaultCardMatrix; |
| private int mCardCount = 0; |
| private int mVisibleSlots = 0; |
| private int mVisibleDetails = DEFAULT_VISIBLE_DETAIL_COUNT; |
| private int mPrefetchCardCount = DEFAULT_PREFETCH_CARD_COUNT; |
| private int mDetailTextureAlignment = DEFAULT_DETAIL_ALIGNMENT; |
| private boolean mForceBlendCardsWithZ = false; |
| private boolean mDrawRuler = true; |
| private float mStartAngle; |
| private float mCarouselRotationAngle; |
| private float mRadius = DEFAULT_RADIUS; |
| private float mCardRotation = 0.0f; |
| private boolean mCardsFaceTangent = false; |
| private float mOverscrollSlots = DEFAULT_OVERSCROLL_SLOTS; |
| private float mSwaySensitivity = DEFAULT_SWAY_SENSITIVITY; |
| private float mFrictionCoefficient = DEFAULT_FRICTION_COEFFICIENT; |
| private float mDragFactor = DEFAULT_DRAG_FACTOR; |
| private int mSlotCount = DEFAULT_SLOT_COUNT; |
| private int mRowCount = DEFAULT_ROW_COUNT; |
| private float mRowSpacing = DEFAULT_ROW_SPACING; |
| private float mEye[] = { 20.6829f, 2.77081f, 16.7314f }; |
| private float mAt[] = { 14.7255f, -3.40001f, -1.30184f }; |
| private float mUp[] = { 0.0f, 1.0f, 0.0f }; |
| private Float4 mBackgroundColor = new Float4(0.0f, 0.0f, 0.0f, 1.0f); |
| private CarouselCallback mCarouselCallback; |
| private float mRezInCardCount = 0.0f; |
| private long mFadeInDuration = 250L; |
| private long mCardCreationFadeDuration = 0L; |
| private Bitmap mDetailLoadingBitmap = Bitmap.createBitmap( |
| new int[] {0}, 0, 1, 1, 1, Bitmap.Config.ARGB_4444); |
| private int mDragModel = CarouselRS.DRAG_MODEL_SCREEN_DELTA; |
| private int mFillDirection = CarouselRS.FILL_DIRECTION_CCW; |
| private boolean mFirstCardTop = false; |
| private int[] mStoreConfigs; |
| |
| public CarouselController() { |
| boolean useDepthBuffer = true; |
| } |
| |
| public void setRS(RenderScriptGL rs, CarouselRS renderScript) { |
| mRS = rs; |
| mRenderScript = renderScript; |
| } |
| |
| public void onSurfaceChanged() { |
| setSlotCount(mSlotCount); |
| setDefaultCardMatrix(mDefaultCardMatrix); |
| createCards(mCardCount); |
| setVisibleSlots(mVisibleSlots); |
| setVisibleDetails(mVisibleDetails); |
| setPrefetchCardCount(mPrefetchCardCount); |
| setOverscrollSlots(mOverscrollSlots); |
| setRowCount(mRowCount); |
| setRowSpacing(mRowSpacing); |
| setFirstCardTop(mFirstCardTop); |
| setDetailTextureAlignment(mDetailTextureAlignment); |
| setForceBlendCardsWithZ(mForceBlendCardsWithZ); |
| setDrawRuler(mDrawRuler); |
| setCallback(mCarouselCallback); |
| setDefaultBitmap(mDefaultBitmap); |
| setLoadingBitmap(mLoadingBitmap); |
| setDefaultGeometry(mDefaultGeometry); |
| setLoadingGeometry(mLoadingGeometry); |
| setBackgroundColor(mBackgroundColor.x, mBackgroundColor.y, mBackgroundColor.z, |
| mBackgroundColor.w); |
| setBackgroundBitmap(mBackgroundBitmap); |
| setDetailLineBitmap(mDefaultLineBitmap); |
| setStartAngle(mStartAngle); |
| setCarouselRotationAngle(mCarouselRotationAngle); |
| setRadius(mRadius); |
| setCardRotation(mCardRotation); |
| setCardsFaceTangent(mCardsFaceTangent); |
| setSwaySensitivity(mSwaySensitivity); |
| setFrictionCoefficient(mFrictionCoefficient); |
| setDragFactor(mDragFactor); |
| setDragModel(mDragModel); |
| setFillDirection(mFillDirection); |
| setLookAt(mEye, mAt, mUp); |
| setRezInCardCount(mRezInCardCount); |
| setFadeInDuration(mFadeInDuration); |
| setCardCreationFadeDuration(mCardCreationFadeDuration); |
| setDetailLoadingBitmap(mDetailLoadingBitmap); |
| setStoreConfigs(mStoreConfigs); |
| } |
| |
| /** |
| * Loads geometry from a resource id. |
| * |
| * @param resId |
| * @return the loaded mesh or null if it cannot be loaded |
| */ |
| public Mesh loadGeometry(int resId) { |
| if (mRenderScript != null) { |
| return mRenderScript.loadGeometry(resId); |
| } |
| return null; |
| } |
| |
| /** |
| * Set the geometry to show for a given slot. |
| * @param n The card to set the geometry for |
| * @param mesh The geometry for that item |
| * @see {@link #setDefaultGeometry} |
| */ |
| public void setGeometryForItem(int n, Mesh mesh) { |
| if (mRenderScript != null) { |
| mRenderScript.setGeometry(n, mesh); |
| } |
| } |
| |
| /** |
| * Load A3D file from resource. If resId == 0, will clear geometry for this item. |
| * @param n The card to set the geometry for |
| * @param resId The resource ID for the geometry for that item |
| * @see {@link #setDefaultGeometry} |
| */ |
| public void setGeometryForItem(int n, int resId) { |
| if (mRenderScript != null) { |
| Mesh mesh = mRenderScript.loadGeometry(resId); |
| mRenderScript.setGeometry(n, mesh); |
| } |
| } |
| |
| /** |
| * Set the matrix for the specified card |
| * @param n The card to set the matrix for |
| * @param matrix The matrix to use |
| * @see {@link #setDefaultGeometry} |
| */ |
| public void setMatrixForItem(int n, float[] matrix) { |
| if (mRenderScript != null) { |
| mRenderScript.setMatrix(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) { |
| mSlotCount = n; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mVisibleSlots = n; |
| if (mRenderScript != null) { |
| mRenderScript.setVisibleSlots(n); |
| } |
| } |
| |
| /** |
| * Set the number of detail textures that can be visible at one time. |
| * |
| * @param n the number of slots |
| */ |
| public void setVisibleDetails(int n) { |
| mVisibleDetails = n; |
| if (mRenderScript != null) { |
| mRenderScript.setVisibleDetails(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) { |
| mPrefetchCardCount = n; |
| if (mRenderScript != null) { |
| mRenderScript.setPrefetchCardCount(n); |
| } |
| } |
| |
| /** |
| * Sets the number of rows of cards to show in each slot. |
| */ |
| public void setRowCount(int n) { |
| mRowCount = n; |
| if (mRenderScript != null) { |
| mRenderScript.setRowCount(n); |
| } |
| } |
| |
| /** |
| * Sets the spacing between each row of cards when rowCount > 1. |
| */ |
| public void setRowSpacing(float s) { |
| mRowSpacing = s; |
| if (mRenderScript != null) { |
| mRenderScript.setRowSpacing(s); |
| } |
| } |
| |
| /** |
| * Sets the position of the first card when rowCount > 1 . |
| */ |
| public void setFirstCardTop(boolean f) { |
| mFirstCardTop = f; |
| if (mRenderScript != null) { |
| mRenderScript.setFirstCardTop(f); |
| } |
| } |
| |
| /** |
| * Sets the amount of allowed overscroll (in slots) |
| */ |
| public void setOverscrollSlots(float slots) { |
| mOverscrollSlots = slots; |
| if (mRenderScript != null) { |
| mRenderScript.setOverscrollSlots(slots); |
| } |
| } |
| |
| /** |
| * Sets how detail textures are aligned with respect to the card. |
| * |
| * @param alignment a bitmask of DetailAlignment flags. |
| */ |
| public void setDetailTextureAlignment(int alignment) { |
| int xBits = alignment & DetailAlignment.HORIZONTAL_ALIGNMENT_MASK; |
| if (xBits == 0 || ((xBits & (xBits - 1)) != 0)) { |
| throw new IllegalArgumentException( |
| "Must specify exactly one horizontal alignment flag"); |
| } |
| int yBits = alignment & DetailAlignment.VERTICAL_ALIGNMENT_MASK; |
| if (yBits == 0 || ((yBits & (yBits - 1)) != 0)) { |
| throw new IllegalArgumentException( |
| "Must specify exactly one vertical alignment flag"); |
| } |
| |
| mDetailTextureAlignment = alignment; |
| if (mRenderScript != null) { |
| mRenderScript.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. Geometry for an individual item must be drawn |
| * back-to-front, for example. |
| * |
| * @param enabled True to enable depth while blending, and false to disable it. |
| */ |
| public void setForceBlendCardsWithZ(boolean enabled) { |
| mForceBlendCardsWithZ = enabled; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mDrawRuler = drawRuler; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mCardCount = n; |
| if (mRenderScript != null) { |
| mRenderScript.createCards(n); |
| } |
| } |
| |
| public int getCardCount() { |
| return mCardCount; |
| } |
| |
| /** |
| * 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) { |
| // Also check against mRS, to handle the case where the result is being delivered by a |
| // background thread but the sender no longer exists. |
| if (mRenderScript != null && mRS != null) { |
| if (DBG) Log.v(TAG, "setTextureForItem(" + n + ")"); |
| mRenderScript.setTexture(n, bitmap); |
| if (DBG) Log.v(TAG, "done"); |
| } |
| } |
| |
| /** |
| * 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) { |
| if (mRenderScript != null && mRS != null) { |
| if (DBG) Log.v(TAG, "setDetailTextureForItem(" + n + ")"); |
| mRenderScript.setDetailTexture(n, offx, offy, loffx, loffy, bitmap); |
| if (DBG) Log.v(TAG, "done"); |
| } |
| } |
| |
| /** |
| * Sets the specified texture as invalid. If {@code eraseCurrent} is true, |
| * the texture will be immediately cleared from view and an invalidate |
| * handler will be called. If {@code eraseCurrent} is false, a replacement |
| * texture will be requested, and the old texture will be left in place in |
| * the meantime. |
| * |
| * @param n the card to invalidate the detail texture for |
| * @param eraseCurrent whether to erase the current texture |
| */ |
| public void invalidateTexture(int n, boolean eraseCurrent) { |
| if (mRenderScript != null && mRS != null) { |
| if (DBG) Log.v(TAG, "invalidateTexture(" + n + ", " + eraseCurrent + ")"); |
| mRenderScript.invalidateTexture(n, eraseCurrent); |
| if (DBG) Log.v(TAG, "done"); |
| } |
| } |
| |
| /** |
| * Sets the specified detail texture as invalid. If eraseCurrent is true, the texture will be |
| * immediately cleared from view and an invalidate handler will be called. If eraseCurrent is |
| * false, a replacement texture will be requested, and the old texture will be left in place |
| * in the meantime. |
| * @param n the card to invalidate the detail texture for |
| * @param eraseCurrent whether to erase the current texture |
| */ |
| public void invalidateDetailTexture(int n, boolean eraseCurrent) { |
| if (mRenderScript != null && mRS != null) { |
| if (DBG) Log.v(TAG, "invalidateDetailTexture(" + n + ", " + eraseCurrent + ")"); |
| mRenderScript.invalidateDetailTexture(n, eraseCurrent); |
| if (DBG) Log.v(TAG, "done"); |
| } |
| } |
| |
| /** |
| * 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) { |
| mDefaultBitmap = bitmap; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mLoadingBitmap = bitmap; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mBackgroundColor = new Float4(red, green, blue, alpha); |
| if (mRenderScript != null) { |
| mRenderScript.setBackgroundColor(mBackgroundColor); |
| } |
| } |
| |
| /** |
| * Can be used to optionally set the background to a bitmap. When set to something other than |
| * null, this overrides {@link CarouselController#setBackgroundColor(Float4)}. |
| * |
| * @param bitmap |
| */ |
| public void setBackgroundBitmap(Bitmap bitmap) { |
| mBackgroundBitmap = bitmap; |
| if (mRenderScript != null) { |
| mRenderScript.setBackgroundTexture(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) { |
| mDetailLoadingBitmap = bitmap; |
| if (mRenderScript != null) { |
| mRenderScript.setDetailLoadingTexture(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) { |
| mDefaultLineBitmap = bitmap; |
| if (mRenderScript != null) { |
| mRenderScript.setDetailLineTexture(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 CarouselController#setForceBlendCardsWithZ(boolean)} |
| * |
| * @param mesh |
| */ |
| public void setDefaultGeometry(int resId) { |
| mDefaultGeometry = resId; |
| if (mRenderScript != null) { |
| Mesh mesh = mRenderScript.loadGeometry(resId); |
| mRenderScript.setDefaultGeometry(mesh); |
| } |
| } |
| |
| /** |
| * 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) { |
| mDefaultCardMatrix = matrix; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mLoadingGeometry = resId; |
| if (mRenderScript != null) { |
| Mesh mesh = mRenderScript.loadGeometry(resId); |
| mRenderScript.setLoadingGeometry(mesh); |
| } |
| } |
| |
| /** |
| * Sets the callback for receiving events from RenderScript. |
| * |
| * @param callback |
| */ |
| public void setCallback(CarouselCallback callback) |
| { |
| mCarouselCallback = callback; |
| if (mRenderScript != null) { |
| mRenderScript.setCallback(callback); |
| } |
| } |
| |
| /** |
| * Gets the callback for receiving events from Renderscript. |
| */ |
| public CarouselCallback getCallback() { |
| return mCarouselCallback; |
| } |
| |
| /** |
| * 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) |
| { |
| mStartAngle = angle; |
| if (mRenderScript != null) { |
| mRenderScript.setStartAngle(angle); |
| } |
| } |
| |
| /** |
| * Set the current carousel rotation angle, in card units. |
| * This is measured in card positions, not in radians or degrees. |
| * |
| * A value of 0.0 means that card 0 is in the home position. |
| * A value of 1.0 means that card 1 is in the home position, and so on. |
| * The maximum value will be somewhat less than the total number of cards. |
| * |
| * @param angle |
| */ |
| public void setCarouselRotationAngle(float angle) { |
| mCarouselRotationAngle = angle; |
| if (mRenderScript != null) { |
| mRenderScript.setCarouselRotationAngle(angle); |
| } |
| } |
| |
| /** |
| * Triggers a rotation of the carousel. All angles are in card units, see: |
| * {@link CarouselController#setCarouselRotationAngle(float)}) for more details. |
| * |
| * @param endAngle the card unit to which the carousel should rotate to |
| * @param milliseconds the length of the animation |
| * @param interpolationMode three modes are currently supported : |
| * {@link CarouselView.InterpolationMode#LINEAR} |
| * {@link CarouselView.InterpolationMode#DECELERATE_QUADRATIC} |
| * {@link CarouselView.InterpolationMode#ACCELERATE_DECELERATE_CUBIC} |
| * @param maxAnimatedArc the maximum angular distance over which the transition will be |
| * animated. |
| * If the current position is further away, it is set at maxAnimatedArc from endAngle. |
| * This parameter is ignored when <= 0. |
| */ |
| public void setCarouselRotationAngle(float endAngle, int milliseconds, int interpolationMode, |
| float maxAnimatedArc) { |
| if (mRenderScript != null) { |
| mRenderScript.setCarouselRotationAngle(endAngle, milliseconds, |
| interpolationMode, maxAnimatedArc); |
| } |
| } |
| |
| public void setRadius(float radius) { |
| mRadius = radius; |
| if (mRenderScript != null) { |
| mRenderScript.setRadius(radius); |
| } |
| } |
| |
| /** |
| * Sets the current model for dragging. There are currently four drag models: |
| * {@link CarouselView#DRAG_MODEL_SCREEN_DELTA} |
| * {@link CarouselView#DRAG_MODEL_PLANE} |
| * {@link CarouselView#DRAG_MODEL_CYLINDER_INSIDE} |
| * {@link CarouselView#DRAG_MODEL_CYLINDER_OUTSIDE} |
| * |
| * @param model |
| */ |
| public void setDragModel(int model) { |
| mDragModel = model; |
| if (mRenderScript != null) { |
| mRenderScript.setDragModel(model); |
| } |
| } |
| |
| /** Sets the direction to fill in cards around the carousel. |
| * |
| * @param direction Either {@link CarouselRS#FILL_DIRECTION_CCW} or |
| * {@link CarouselRS#FILL_DIRECTION_CW}. |
| */ |
| public void setFillDirection(int direction) { |
| mFillDirection = direction; |
| if (mRenderScript != null) { |
| mRenderScript.setFillDirection(direction); |
| } |
| } |
| |
| public void setCardRotation(float cardRotation) { |
| mCardRotation = cardRotation; |
| if (mRenderScript != null) { |
| mRenderScript.setCardRotation(cardRotation); |
| } |
| } |
| |
| public void setCardsFaceTangent(boolean faceTangent) { |
| mCardsFaceTangent = faceTangent; |
| if (mRenderScript != null) { |
| mRenderScript.setCardsFaceTangent(faceTangent); |
| } |
| } |
| |
| public void setSwaySensitivity(float swaySensitivity) { |
| mSwaySensitivity = swaySensitivity; |
| if (mRenderScript != null) { |
| mRenderScript.setSwaySensitivity(swaySensitivity); |
| } |
| } |
| |
| public void setFrictionCoefficient(float frictionCoefficient) { |
| mFrictionCoefficient = frictionCoefficient; |
| if (mRenderScript != null) { |
| mRenderScript.setFrictionCoefficient(frictionCoefficient); |
| } |
| } |
| |
| public void setDragFactor(float dragFactor) { |
| mDragFactor = dragFactor; |
| if (mRenderScript != null) { |
| mRenderScript.setDragFactor(dragFactor); |
| } |
| } |
| |
| public void setLookAt(float[] eye, float[] at, float[] up) { |
| mEye = eye; |
| mAt = at; |
| mUp = up; |
| if (mRenderScript != null) { |
| mRenderScript.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) { |
| mRezInCardCount = n; |
| if (mRenderScript != null) { |
| mRenderScript.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 The time, in milliseconds |
| */ |
| public void setFadeInDuration(long t) { |
| mFadeInDuration = t; |
| if (mRenderScript != null) { |
| mRenderScript.setFadeInDuration(t); |
| } |
| } |
| |
| /** |
| * This sets the duration (in ms) that a card takes to fade in when it is initially created, |
| * such as when it is added or when the application starts. The timer starts at the moment |
| * when the card is first created. Replacing a card's contents does not affect the timer. |
| * @param t The time, in milliseconds |
| */ |
| public void setCardCreationFadeDuration(long t) { |
| mCardCreationFadeDuration = t; |
| if (mRenderScript != null) { |
| mRenderScript.setCardCreationFadeDuration(t); |
| } |
| } |
| |
| /** |
| * Tells the carousel that a touch event has started at the designated location. |
| * @param x The number of pixels from the left edge that the event occurred |
| * @param y The number of pixels from the top edge that the event occurred |
| * @param t The time stamp of the event |
| */ |
| public void onTouchStarted(float x, float y, long t) { |
| mRenderScript.doStart(x, y, t); |
| } |
| |
| /** |
| * Tells the carousel that a touch event has moved to the designated location. |
| * @param x The number of pixels from the left edge that the event occurred |
| * @param y The number of pixels from the top edge that the event occurred |
| * @param t The time stamp of the event |
| */ |
| public void onTouchMoved(float x, float y, long t) { |
| mRenderScript.doMotion(x, y, t); |
| } |
| |
| /** |
| * Tells the carousel that the user has long-pressed. |
| */ |
| public void onLongPress() { |
| mRenderScript.doLongPress(); |
| } |
| |
| /** |
| * Tells the carousel that a touch event has stopped at the designated location. |
| * @param x The number of pixels from the left edge that the event occurred |
| * @param y The number of pixels from the top edge that the event occurred |
| * @param t The time stamp of the event |
| */ |
| public void onTouchStopped(float x, float y, long t) { |
| mRenderScript.doStop(x, y, t); |
| } |
| |
| /** |
| * Whether to use alpha when drawing a primitive: on for translucent, off for opaque. |
| */ |
| public static final int STORE_CONFIG_ALPHA = 1; |
| |
| /** |
| * Whether to read from the depth buffer when rendering. Determines with glDepthFunc() |
| * is given GL_LESS or GL_ALWAYS. On for GL_LESS, off for GL_ALWAYS. |
| */ |
| public static final int STORE_CONFIG_DEPTH_READS = 2; |
| |
| /** |
| * Whether to write to the depth buffer when rendering. Passed to glDepthMask(). |
| */ |
| public static final int STORE_CONFIG_DEPTH_WRITES = 4; |
| |
| /** |
| * Set the StoreConfig parameters that will be used for each mesh primitive. |
| * |
| * Each integer in the array is a bitfield composed of |
| * {@link CarouselController#STORE_CONFIG_ALPHA}, |
| * {@link CarouselController#STORE_CONFIG_DEPTH_READS}, and |
| * {@link CarouselController#STORE_CONFIG_DEPTH_WRITES}. |
| * |
| * These parameters MUST correspond to primitives in geometry previously set in |
| * {@link CarouselController#setDefaultGeometry(int)} or |
| * {@link CarouselController#setLoadingGeometry(int)} or |
| * {@link CarouselController#setGeometryForItem(int,Mesh)}. |
| * |
| * @param configs An array, each element of which corresponds to an ordered mesh primitive |
| */ |
| public void setStoreConfigs(int configs[]) { |
| mStoreConfigs = configs; |
| if (mRenderScript != null) { |
| mRenderScript.setStoreConfigs(configs); |
| } |
| } |
| } |