AbstractSlotRenderer.java revision a4eae1abb4f2547dfbda84301ee764ce35464881
131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin/* 231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * Copyright (C) 2012 The Android Open Source Project 331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * 431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * you may not use this file except in compliance with the License. 631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * You may obtain a copy of the License at 731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * 831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * 1031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * Unless required by applicable law or agreed to in writing, software 1131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 1231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * See the License for the specific language governing permissions and 1431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin * limitations under the License. 1531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin */ 1631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 1731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linpackage com.android.gallery3d.ui; 1831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 1931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport android.content.Context; 2031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport android.graphics.Rect; 2131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 2231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.R; 23a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.FadeOutTexture; 24a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas; 25a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.NinePatchTexture; 26a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.ResourceTexture; 27a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.Texture; 2831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 2931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linpublic abstract class AbstractSlotRenderer implements SlotView.SlotRenderer { 3031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 3131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private final ResourceTexture mVideoOverlay; 3231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private final ResourceTexture mVideoPlayIcon; 332f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu private final ResourceTexture mPanoramaIcon; 3431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private final NinePatchTexture mFramePressed; 3531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private final NinePatchTexture mFrameSelected; 3690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private FadeOutTexture mFramePressedUp; 3731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 3831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin protected AbstractSlotRenderer(Context context) { 3931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mVideoOverlay = new ResourceTexture(context, R.drawable.ic_video_thumb); 4031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mVideoPlayIcon = new ResourceTexture(context, R.drawable.ic_gallery_play); 412f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu mPanoramaIcon = new ResourceTexture(context, R.drawable.ic_360pano_holo_light); 4231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mFramePressed = new NinePatchTexture(context, R.drawable.grid_pressed); 4331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mFrameSelected = new NinePatchTexture(context, R.drawable.grid_selected); 4431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 4531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 4631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin protected void drawContent(GLCanvas canvas, 4731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin Texture content, int width, int height, int rotation) { 4831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 4931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 5039765b30b48c4530e11642a05a582ddf3ad27992Bobby Georgescu // The content is always rendered in to the largest square that fits 5139765b30b48c4530e11642a05a582ddf3ad27992Bobby Georgescu // inside the slot, aligned to the top of the slot. 5239765b30b48c4530e11642a05a582ddf3ad27992Bobby Georgescu width = height = Math.min(width, height); 5331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (rotation != 0) { 54a25864674c3ce58bd8e013af9c1af7b8e3b0946dOwen Lin canvas.translate(width / 2, height / 2); 5531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin canvas.rotate(rotation, 0, 0, 1); 56a25864674c3ce58bd8e013af9c1af7b8e3b0946dOwen Lin canvas.translate(-width / 2, -height / 2); 5731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 5831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 5931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin // Fit the content into the box 6031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin float scale = Math.min( 6131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin (float) width / content.getWidth(), 6231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin (float) height / content.getHeight()); 6331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin canvas.scale(scale, scale, 1); 6431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin content.draw(canvas, 0, 0); 6531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 6631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin canvas.restore(); 6731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 6831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 6931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin protected void drawVideoOverlay(GLCanvas canvas, int width, int height) { 7031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin // Scale the video overlay to the height of the thumbnail and put it 7131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin // on the left side. 7231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin ResourceTexture v = mVideoOverlay; 7331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin float scale = (float) height / v.getHeight(); 7431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin int w = Math.round(scale * v.getWidth()); 7531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin int h = Math.round(scale * v.getHeight()); 7631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin v.draw(canvas, 0, 0, w, h); 7731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 7831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin int s = Math.min(width, height) / 6; 7931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mVideoPlayIcon.draw(canvas, (width - s) / 2, (height - s) / 2, s, s); 8031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 8131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 822f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu protected void drawPanoramaIcon(GLCanvas canvas, int width, int height) { 832f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu int iconSize = Math.min(width, height) / 6; 842f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu mPanoramaIcon.draw(canvas, (width - iconSize) / 2, (height - iconSize) / 2, 852f060cc74ab6be5e5dd39e53dc99941b368ffb60Doris Liu iconSize, iconSize); 8631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 8731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 8890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang protected boolean isPressedUpFrameFinished() { 8990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mFramePressedUp != null) { 9090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mFramePressedUp.isAnimating()) { 9190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang return false; 9290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 9390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mFramePressedUp = null; 9490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 9590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 9690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang return true; 9790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 9890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 9990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang protected void drawPressedUpFrame(GLCanvas canvas, int width, int height) { 10090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mFramePressedUp == null) { 10190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mFramePressedUp = new FadeOutTexture(mFramePressed); 10290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 10390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang drawFrame(canvas, mFramePressed.getPaddings(), mFramePressedUp, 0, 0, width, height); 10490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 10590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 10631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin protected void drawPressedFrame(GLCanvas canvas, int width, int height) { 10790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang drawFrame(canvas, mFramePressed.getPaddings(), mFramePressed, 0, 0, width, height); 10831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 10931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 11031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin protected void drawSelectedFrame(GLCanvas canvas, int width, int height) { 11190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang drawFrame(canvas, mFrameSelected.getPaddings(), mFrameSelected, 0, 0, width, height); 11231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 11331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 11490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang protected static void drawFrame(GLCanvas canvas, Rect padding, Texture frame, 11531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin int x, int y, int width, int height) { 11690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang frame.draw(canvas, x - padding.left, y - padding.top, width + padding.left + padding.right, 11790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang height + padding.top + padding.bottom); 11831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 11931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin} 120