CarouselView.java revision a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3
15ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller/*
25ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Copyright (C) 2010 The Android Open Source Project
35ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
45ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Licensed under the Apache License, Version 2.0 (the "License");
55ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * you may not use this file except in compliance with the License.
65ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * You may obtain a copy of the License at
75ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
85ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *      http://www.apache.org/licenses/LICENSE-2.0
95ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Unless required by applicable law or agreed to in writing, software
115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * distributed under the License is distributed on an "AS IS" BASIS,
125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * See the License for the specific language governing permissions and
145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * limitations under the License.
155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */
165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpackage com.android.ex.carousel;
185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
19594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shumaimport android.view.View;
205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport com.android.ex.carousel.CarouselRS.CarouselCallback;
215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.Context;
235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Resources;
245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap;
25a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.PixelFormat;
265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap.Config;
275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.FileA3D;
28b0f070636c29ad178f4e21306f301fe3d20c183bJim Millerimport android.renderscript.Float4;
295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.Mesh;
305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RSSurfaceView;
315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RenderScriptGL;
325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.AttributeSet;
335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log;
345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.view.MotionEvent;
355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.view.SurfaceHolder;
365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller/**
387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * <p>
397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This class represents the basic building block for using a 3D Carousel. The Carousel is
407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * basically a scene of cards and slots.  The spacing between cards is dictated by the number
417cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * of slots and the radius. The number of visible cards dictates how far the Carousel can be moved.
427cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * If the number of cards exceeds the number of slots, then the Carousel will continue to go
437cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * around until the last card can be seen.
447cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */
455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic abstract class CarouselView extends RSSurfaceView {
465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final boolean USE_DEPTH_BUFFER = true;
475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private final int DEFAULT_SLOT_COUNT = 10;
48c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private final float DEFAULT_RADIUS = 20.0f;
497c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    private final int DEFAULT_VISIBLE_DETAIL_COUNT = 3;
504fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    private final int DEFAULT_PREFETCH_CARD_COUNT = 2;
51c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private final float DEFAULT_SWAY_SENSITIVITY = 0.0f;
52c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private final float DEFAULT_FRICTION_COEFFICIENT = 10.0f;
53c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private final float DEFAULT_DRAG_FACTOR = 0.25f;
545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final String TAG = "CarouselView";
557cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    private static final boolean DBG = false;
565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private CarouselRS mRenderScript;
575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private RenderScriptGL mRS;
585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Context mContext;
595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private boolean mTracking;
609afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller
617cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    // These shadow the state of the renderer in case the surface changes so the surface
627cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    // can be restored to its previous state.
635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Bitmap mDefaultBitmap;
645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Bitmap mLoadingBitmap;
659afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    private Bitmap mBackgroundBitmap;
667cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    private Bitmap mDefaultLineBitmap = Bitmap.createBitmap(
672ba04e061b52c488a154739379501dc833e39f79Jim Miller            new int[] {0x00000000, 0xffffffff, 0x00000000}, 0, 3, 3, 1, Bitmap.Config.ARGB_4444);
685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Mesh mDefaultGeometry;
695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Mesh mLoadingGeometry;
705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private int mCardCount = 0;
715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private int mVisibleSlots = 0;
727c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    private int mVisibleDetails = DEFAULT_VISIBLE_DETAIL_COUNT;
734fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    private int mPrefetchCardCount = DEFAULT_PREFETCH_CARD_COUNT;
747c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    private boolean mDrawDetailBelowCard = false;
754fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    private boolean mDetailTexturesCentered = false;
76bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    private boolean mDrawCardsWithBlending = true;
777c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    private boolean mDrawRuler = true;
785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private float mStartAngle;
79a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    private float mCarouselRotationAngle;
80c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mRadius = DEFAULT_RADIUS;
81c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mCardRotation = 0.0f;
8283d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    private boolean mCardsFaceTangent = false;
83c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mSwaySensitivity = DEFAULT_SWAY_SENSITIVITY;
84c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mFrictionCoefficient = DEFAULT_FRICTION_COEFFICIENT;
85c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mDragFactor = DEFAULT_DRAG_FACTOR;
865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private int mSlotCount = DEFAULT_SLOT_COUNT;
87c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mEye[] = { 20.6829f, 2.77081f, 16.7314f };
88c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mAt[] = { 14.7255f, -3.40001f, -1.30184f };
89c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    private float mUp[] = { 0.0f, 1.0f, 0.0f };
906b1fa13e79a6ae467d16da223fd36db53fa5a5cbJim Miller    private Float4 mBackgroundColor = new Float4(0.0f, 0.0f, 0.0f, 1.0f);
91a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private CarouselCallback mCarouselCallback;
92420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private float mRezInCardCount = 0.0f;
93420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private long mFadeInDuration = 250L;
94420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private Bitmap mDetailLoadingBitmap = Bitmap.createBitmap(
95420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            new int[] {0}, 0, 1, 1, 1, Bitmap.Config.ARGB_4444);
965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static class Info {
989afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        public Info(int _resId) { resId = _resId; }
995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public int resId; // resource for renderscript resource (e.g. R.raw.carousel)
1005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public abstract Info getRenderScriptInfo();
1035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public CarouselView(Context context) {
1055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        this(context, null);
1065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    /**
1095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * Constructor used when this widget is created from a layout file.
1105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     */
1115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public CarouselView(Context context, AttributeSet attrs) {
1125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super(context, attrs);
1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mContext = context;
1145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        boolean useDepthBuffer = true;
115e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney        ensureRenderScript();
1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // TODO: add parameters to layout
117594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
118594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        setOnLongClickListener(new OnLongClickListener() {
119594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma            public boolean onLongClick(View v) {
120594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                if (interpretLongPressEvents()) {
121594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                    mRenderScript.doLongPress();
122594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                    return true;
123594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                } else {
124594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                    return false;
125594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                }
126594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma            }
127594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        });
1285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void ensureRenderScript() {
131e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney        if (mRS == null) {
132fc1960b04f7746f8bdb13cc5bf3297fe0928c851Jason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
133fc1960b04f7746f8bdb13cc5bf3297fe0928c851Jason Sams            sc.setDepth(16, 24);
134fc1960b04f7746f8bdb13cc5bf3297fe0928c851Jason Sams            mRS = createRenderScript(sc);
135e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney        }
136a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        if (mRenderScript == null) {
137a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller            mRenderScript = new CarouselRS(mRS, getResources(), getRenderScriptInfo().resId);
138a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller            mRenderScript.resumeRendering();
139a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        }
1405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
1435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
1445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.surfaceChanged(holder, format, w, h);
1455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        //mRS.contextSetSurface(w, h, holder.getSurface());
146a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        mRenderScript.resumeRendering();
1475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setSlotCount(mSlotCount);
1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        createCards(mCardCount);
1495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setVisibleSlots(mVisibleSlots);
1507c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        setVisibleDetails(mVisibleDetails);
1514fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        setPrefetchCardCount(mPrefetchCardCount);
1527c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        setDrawDetailBelowCard(mDrawDetailBelowCard);
1537c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        setDrawRuler(mDrawRuler);
1545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setCallback(mCarouselCallback);
1555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setDefaultBitmap(mDefaultBitmap);
1565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setLoadingBitmap(mLoadingBitmap);
1575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setDefaultGeometry(mDefaultGeometry);
1585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setLoadingGeometry(mLoadingGeometry);
159b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        setBackgroundColor(mBackgroundColor.x, mBackgroundColor.y, mBackgroundColor.z,
160b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller                mBackgroundColor.w);
1619afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        setBackgroundBitmap(mBackgroundBitmap);
1627cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        setDetailLineBitmap(mDefaultLineBitmap);
1635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setStartAngle(mStartAngle);
164a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        setCarouselRotationAngle(mCarouselRotationAngle);
165c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setRadius(mRadius);
166c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setCardRotation(mCardRotation);
16783d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        setCardsFaceTangent(mCardsFaceTangent);
168c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setSwaySensitivity(mSwaySensitivity);
169c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setFrictionCoefficient(mFrictionCoefficient);
170c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setDragFactor(mDragFactor);
171c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        setLookAt(mEye, mAt, mUp);
172420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        setRezInCardCount(mRezInCardCount);
173420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        setFadeInDuration(mFadeInDuration);
174420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        setDetailLoadingBitmap(mDetailLoadingBitmap);
17550c5e37bb3a952d1da78582d00922a28c55c0239Jack Palevich        setDrawCardsWithBlending(mDrawCardsWithBlending);
1765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    /**
179594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * Do I want to interpret the long-press gesture? If so, long-presses will cancel the
180594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * current selection and call the appropriate callbacks. Otherwise, a long press will
181594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * not be handled any way other than as a continued drag.
182594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     *
183594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * @return True if we interpret long-presses
184594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     */
185594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    public boolean interpretLongPressEvents() {
186594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        return false;
187594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    }
188594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
189594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    /**
1905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * Loads geometry from a resource id.
1915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     *
1925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * @param resId
1935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * @return the loaded mesh or null if it cannot be loaded
1945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     */
1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public Mesh loadGeometry(int resId) {
1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Resources res = mContext.getResources();
1975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        FileA3D model = FileA3D.createFromResource(mRS, res, resId);
1985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        FileA3D.IndexEntry entry = model.getIndexEntry(0);
1995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if(entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
2005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            return null;
2015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        return (Mesh) entry.getObject();
2035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    /**
2065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * Load A3D file from resource.  If resId == 0, will clear geometry for this item.
2075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * @param n
2085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     * @param resId
2095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller     */
2105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setGeometryForItem(int n, Mesh mesh) {
211c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
212c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setGeometry(n, mesh);
213c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
2145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2167cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
2177cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Set the number of slots around the Carousel. Basically equivalent to the poles horses
2187cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * might attach to on a real Carousel.
2197cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
2207cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param n the number of slots
2217cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
2225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setSlotCount(int n) {
2235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mSlotCount = n;
2245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
2255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setSlotCount(n);
2265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2297cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
2307cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Sets the number of visible slots around the Carousel.  This is primarily used as a cheap
2317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * form of clipping. The Carousel will never show more than this many cards.
2327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param n the number of visible slots
2337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
2345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setVisibleSlots(int n) {
2355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mVisibleSlots = n;
2365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
2375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setVisibleSlots(n);
2385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2417cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
2427c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * Set the number of detail textures that can be visible at one time.
2437c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     *
2447c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * @param n the number of slots
2457c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     */
2467c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setVisibleDetails(int n) {
2477c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mVisibleDetails = n;
2487c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        if (mRenderScript != null) {
2497c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma            mRenderScript.setVisibleDetails(n);
2507c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        }
2517c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
2527c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
2537c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    /**
2544fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * Set the number of cards to pre-load that are outside of the visible region, as determined by
2554fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * setVisibleSlots(). This number gets added to the number of visible slots and used to
2564fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * determine when resources for cards should be loaded. This number should be small (n <= 4)
2574fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * for systems with limited texture memory or views that show more than half dozen cards in the
2584fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * view.
2594fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     *
2604fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * @param n the number of cards; should be even, so the count is the same on each side
2614fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     */
2624fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    public void setPrefetchCardCount(int n) {
2634fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        mPrefetchCardCount = n;
2644fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        if (mRenderScript != null) {
2654fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma            mRenderScript.setPrefetchCardCount(n);
2664fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        }
2674fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
2684fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
2694fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    /**
2707c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * Set whether to draw the detail texture above or below the card.
2717c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     *
2727c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * @param below False for above, true for below.
2737c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     */
2747c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setDrawDetailBelowCard(boolean below) {
2757c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mDrawDetailBelowCard = below;
2767c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        if (mRenderScript != null) {
2777c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma            mRenderScript.setDrawDetailBelowCard(below);
2787c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        }
2797c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
2807c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
2817c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    /**
2824fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * Set whether to align the detail texture center with the card center.
2834fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * If not, left edges will be aligned instead.
2844fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     *
2854fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * @param centered True for center-aligned, false for left-aligned.
2864fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     */
2874fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    public void setDetailTexturesCentered(boolean centered) {
2884fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        mDetailTexturesCentered = centered;
2894fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        if (mRenderScript != null) {
2904fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma            mRenderScript.setDetailTexturesCentered(centered);
2914fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        }
2924fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
2934fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
294bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    public void setDrawCardsWithBlending(boolean enabled) {
295bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma        mDrawCardsWithBlending = enabled;
296bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma        if (mRenderScript != null) {
297bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma            mRenderScript.setDrawCardsWithBlending(enabled);
298bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma        }
299bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    }
300bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma
3014fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    /**
3027c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * Set whether to draw a ruler from the card to the detail texture
3037c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     *
3047c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     * @param drawRuler True to draw a ruler, false to draw nothing where the ruler would go.
3057c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma     */
3067c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setDrawRuler(boolean drawRuler) {
3077c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mDrawRuler = drawRuler;
3087c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        if (mRenderScript != null) {
3097c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma            mRenderScript.setDrawRuler(drawRuler);
3107c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        }
3117c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
3127c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
3137c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    /**
3147cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This dictates how many cards are in the deck.  If the number of cards is greater than the
3157cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * number of slots, then the Carousel goes around n / slot_count times.
3167cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
3177cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Can be called again to increase or decrease the number of cards.
3187cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
3197cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param n the number of cards to create.
3207cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
3215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void createCards(int n) {
3225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mCardCount = n;
3235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
3245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.createCards(n);
3255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
3265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
328a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public int getCardCount() {
329a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return mCardCount;
330a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
331a3cb716626b477c98ba912698c765eab20f27286Jim Miller
3327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
3337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This sets the texture on card n.  It should only be called in response to
3347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * {@link CarouselCallback#onRequestTexture(int)}.  Since there's no guarantee
3357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * that a given texture is still on the screen, replacing this texture should be done
3367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * by first setting it to null and then waiting for the next
3377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * {@link CarouselCallback#onRequestTexture(int)} to swap it with the new one.
3387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
3397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param n the card given by {@link CarouselCallback#onRequestTexture(int)}
3407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap the bitmap image to show
3417cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
3425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setTextureForItem(int n, Bitmap bitmap) {
343c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        // Also check against mRS, to handle the case where the result is being delivered by a
344c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        // background thread but the sender no longer exists.
345c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null && mRS != null) {
3467cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            if (DBG) Log.v(TAG, "setTextureForItem(" + n + ")");
3479afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller            mRenderScript.setTexture(n, bitmap);
3487cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            if (DBG) Log.v(TAG, "done");
3495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
3505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3527cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
3537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This sets the detail texture that floats above card n. It should only be called in response
3547cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * to {@link CarouselCallback#onRequestDetailTexture(int)}.  Since there's no guarantee
3557cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * that a given texture is still on the screen, replacing this texture should be done
3567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * by first setting it to null and then waiting for the next
3577cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * {@link CarouselCallback#onRequestDetailTexture(int)} to swap it with the new one.
3587cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
359b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller     * @param n the card to set detail texture for
360b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller     * @param offx an optional offset to apply to the texture (in pixels) from top of detail line
361b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller     * @param offy an optional offset to apply to the texture (in pixels) from top of detail line
362b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller     * @param loffx an optional offset to apply to the line (in pixels) from left edge of card
363b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller     * @param loffy an optional offset to apply to the line (in pixels) from top of screen
3647cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap the bitmap to show as the detail
3657cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
366b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller    public void setDetailTextureForItem(int n, float offx, float offy, float loffx, float loffy,
367b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            Bitmap bitmap) {
3687ec486bf1373232a35efa96622f31ac1aff5456bBryan Mawhinney        if (mRenderScript != null && mRS != null) {
3697cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            if (DBG) Log.v(TAG, "setDetailTextureForItem(" + n + ")");
370b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            mRenderScript.setDetailTexture(n, offx, offy, loffx, loffy, bitmap);
3717cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            if (DBG) Log.v(TAG, "done");
3727cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
3737cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
3747cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
3757cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
3767cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Sets the bitmap to show on a card when the card draws the very first time.
3777cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Generally, this bitmap will only be seen during the first few frames of startup
3787cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * or when the number of cards are changed.  It can be ignored in most cases,
3797cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * as the cards will generally only be in the loading or loaded state.
3807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
3817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap
3827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
3835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultBitmap(Bitmap bitmap) {
3849afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        mDefaultBitmap = bitmap;
3855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
3865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setDefaultBitmap(bitmap);
3875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
3885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
3917cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Sets the bitmap to show on the card while the texture is loading. It is set to this
3927cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * value just before {@link CarouselCallback#onRequestTexture(int)} is called and changed
3937cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * when {@link CarouselView#setTextureForItem(int, Bitmap)} is called. It is shared by all
3947cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * cards.
3957cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
3967cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap
3977cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
3985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingBitmap(Bitmap bitmap) {
3995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mLoadingBitmap = bitmap;
4005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
4015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setLoadingBitmap(bitmap);
4025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4057cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
406b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * Sets background to specified color.  If a background texture is specified with
407b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * {@link CarouselView#setBackgroundBitmap(Bitmap)}, then this call has no effect.
408b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     *
409b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * @param red the amount of red
410b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * @param green the amount of green
411b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * @param blue the amount of blue
412b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * @param alpha the amount of alpha
413b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     */
414b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    public void setBackgroundColor(float red, float green, float blue, float alpha) {
415b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        mBackgroundColor = new Float4(red, green, blue, alpha);
416b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        if (mRenderScript != null) {
417b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller            mRenderScript.setBackgroundColor(mBackgroundColor);
418b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        }
419b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    }
420420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
421b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    /**
422b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * Can be used to optionally set the background to a bitmap. When set to something other than
423b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller     * null, this overrides {@link CarouselView#setBackgroundColor(Float4)}.
4247cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
4257cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap
4267cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
4279afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    public void setBackgroundBitmap(Bitmap bitmap) {
4289afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        mBackgroundBitmap = bitmap;
4299afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        if (mRenderScript != null) {
4309afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller            mRenderScript.setBackgroundTexture(bitmap);
4319afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        }
4329afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    }
4339afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller
4347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
435420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * Can be used to optionally set a "loading" detail bitmap. Typically, this is just a black
436420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * texture with alpha = 0 to allow details to slowly fade in.
437420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     *
438420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * @param bitmap
439420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     */
440420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setDetailLoadingBitmap(Bitmap bitmap) {
441420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mDetailLoadingBitmap = bitmap;
442420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        if (mRenderScript != null) {
443420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            mRenderScript.setDetailLoadingTexture(bitmap);
444420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        }
445420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
446420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
447420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    /**
4487cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This texture is used to draw a line from the card alongside the texture detail. The line
4497cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * will be as wide as the texture. It can be used to give the line glow effects as well as
4507cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * allowing other blending effects. It is typically one dimensional, e.g. 3x1.
4517cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
4527cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param bitmap
4537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
4547cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public void setDetailLineBitmap(Bitmap bitmap) {
4557cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        mDefaultLineBitmap = bitmap;
4567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        if (mRenderScript != null) {
4577cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            mRenderScript.setDetailLineTexture(bitmap);
4587cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
4597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
4607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
4617cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
4627cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This geometry will be shown when no geometry has been loaded for a given slot. If not set,
4637cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * a quad will be drawn in its place. It is shared for all cards.
4647cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
4657cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param mesh
4667cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
4675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultGeometry(Mesh mesh) {
4685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mDefaultGeometry = mesh;
4695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
4705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setDefaultGeometry(mesh);
4715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4747cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
4757cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * This is an intermediate version of the object to show while geometry is loading. If not set,
4767cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * a quad will be drawn in its place.  It is shared for all cards.
4777cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
4787cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param mesh
4797cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
4805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingGeometry(Mesh mesh) {
4815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mLoadingGeometry = mesh;
4825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
4835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setLoadingGeometry(mesh);
4845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
4887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Sets the callback for receiving events from RenderScript.
4897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
4907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param callback
4917cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
4925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setCallback(CarouselCallback callback)
4935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mCarouselCallback = callback;
4955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
4965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setCallback(callback);
4975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
5007cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    /**
5017cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Sets the startAngle for the Carousel. The start angle is the first position of the first
5027cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * slot draw.  Cards will be drawn from this angle in a counter-clockwise manner around the
5037cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * Carousel.
5047cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     *
5057cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     * @param angle the angle, in radians.
5067cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller     */
5075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setStartAngle(float angle)
5085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
5095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mStartAngle = angle;
5105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript != null) {
5115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRenderScript.setStartAngle(angle);
5125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
5135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
514c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
515a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    /**
516a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * Set the current carousel rotation angle, in card units.
517a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * This is measured in card positions, not in radians or degrees.
518a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     *
519a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * A value of 0.0 means that card 0 is in the home position.
520a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * A value of 1.0 means that card 1 is in the home position, and so on.
521a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * The maximum value will be somewhat less than the total number of cards.
522a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     *
523a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * @param angle
524a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     */
525a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    public void setCarouselRotationAngle(float angle) {
526a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        mCarouselRotationAngle = angle;
527a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        if (mRenderScript != null) {
528a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich            mRenderScript.setCarouselRotationAngle(angle);
529a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        }
530a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    }
531a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich
532c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setRadius(float radius) {
533c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mRadius = radius;
534c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
535c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setRadius(radius);
536c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
537c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
538c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
539c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setCardRotation(float cardRotation) {
540c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mCardRotation = cardRotation;
541c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
542c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setCardRotation(cardRotation);
543c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
544c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
545c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
54683d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    public void setCardsFaceTangent(boolean faceTangent) {
54783d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        mCardsFaceTangent = faceTangent;
54883d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        if (mRenderScript != null) {
54983d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney          mRenderScript.setCardsFaceTangent(faceTangent);
55083d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        }
55183d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    }
55283d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney
553c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setSwaySensitivity(float swaySensitivity) {
554c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mSwaySensitivity = swaySensitivity;
555c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
556c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setSwaySensitivity(swaySensitivity);
557c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
558c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
559c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
560c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setFrictionCoefficient(float frictionCoefficient) {
561c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mFrictionCoefficient = frictionCoefficient;
562c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
563c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setFrictionCoefficient(frictionCoefficient);
564c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
565c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
566c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
567c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setDragFactor(float dragFactor) {
568c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mDragFactor = dragFactor;
569c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
570c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setDragFactor(dragFactor);
571c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
572c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
573c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
574c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setLookAt(float[] eye, float[] at, float[] up) {
575c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mEye = eye;
576c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mAt = at;
577c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mUp = up;
578c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        if (mRenderScript != null) {
579c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma            mRenderScript.setLookAt(eye, at, up);
580c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        }
581c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
5825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
583420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    /**
584420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * This sets the number of cards in the distance that will be shown "rezzing in".
585420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * These alpha values will be faded in from the background to the foreground over
586420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * 'n' cards.  A floating point value is used to allow subtly changing the rezzing in
587420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * position.
588420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     *
589420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * @param n the number of cards to rez in.
590420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     */
591420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setRezInCardCount(float n) {
592420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mRezInCardCount = n;
593420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        if (mRenderScript != null) {
594420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            mRenderScript.setRezInCardCount(n);
595420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        }
596420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
597420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
598420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    /**
599420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * This sets the duration (in ms) that a card takes to fade in when loaded via a call
600420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * to {@link CarouselView#setTextureForItem(int, Bitmap)}. The timer starts the
601420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * moment {@link CarouselView#setTextureForItem(int, Bitmap)} is called and continues
602420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * until all of the cards have faded in.  Note: using large values will extend the
603420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * animation until all cards have faded in.
604420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     *
605420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     * @param t
606420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller     */
607420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setFadeInDuration(long t) {
608420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mFadeInDuration = t;
609420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        if (mRenderScript != null) {
610420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            mRenderScript.setFadeInDuration(t);
611420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        }
612420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
613420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
6145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
6155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    protected void onDetachedFromWindow() {
6165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.onDetachedFromWindow();
617c3e94dc22d3c03b514bf3aff41082bfab7aca845Jack Palevich        mRenderScript = null;
618c3e94dc22d3c03b514bf3aff41082bfab7aca845Jack Palevich        if (mRS != null) {
6195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mRS = null;
6205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            destroyRenderScript();
6215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
6225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
6255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    protected void onAttachedToWindow() {
6265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.onAttachedToWindow();
6275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ensureRenderScript();
6285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
6315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public boolean onTouchEvent(MotionEvent event) {
632594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        super.onTouchEvent(event);
6335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final int action = event.getAction();
6345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final float x = event.getX();
6355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final float y = event.getY();
6365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (mRenderScript == null) {
6385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            return true;
6395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
6405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        switch (action) {
6425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            case MotionEvent.ACTION_DOWN:
6435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                mTracking = true;
6445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                mRenderScript.doStart(x, y);
6455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                break;
6465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            case MotionEvent.ACTION_MOVE:
6485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                if (mTracking) {
6495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mRenderScript.doMotion(x, y);
6505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                }
6515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                break;
6525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            case MotionEvent.ACTION_UP:
6545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                mRenderScript.doStop(x, y);
6555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                mTracking = false;
6565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                break;
6575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
6585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        return true;
6605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller}
662