16b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang/* 26b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Copyright (C) 2012 The Android Open Source Project 36b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * 46b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 56b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * you may not use this file except in compliance with the License. 66b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * You may obtain a copy of the License at 76b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * 86b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 96b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * 106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * See the License for the specific language governing permissions and 146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * limitations under the License. 156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang */ 166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changpackage com.android.gallery3d.ui; 186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport android.content.Context; 206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport android.view.MotionEvent; 216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.R; 23517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Changimport com.android.gallery3d.common.Utils; 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.StringTexture; 286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.util.GalleryUtils; 296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changpublic class UndoBarView extends GLView { 317817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @SuppressWarnings("unused") 326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private static final String TAG = "UndoBarView"; 336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private static final int WHITE = 0xFFFFFFFF; 356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private static final int GRAY = 0xFFAAAAAA; 366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final NinePatchTexture mPanel; 386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final StringTexture mUndoText; 396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final StringTexture mDeletedText; 406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final ResourceTexture mUndoIcon; 416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mBarHeight; 426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mBarMargin; 436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mUndoTextMargin; 446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mIconSize; 456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mIconMargin; 466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mSeparatorTopMargin; 476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mSeparatorBottomMargin; 486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mSeparatorRightMargin; 496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mSeparatorWidth; 506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mDeletedTextMargin; 516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private final int mClickRegion; 526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private OnClickListener mOnClickListener; 546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDownOnButton; 556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // This is the layout of UndoBarView. The unit is dp. 576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 586b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // +-+----+----------------+-+--+----+-+------+--+-+ 596b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 48 | | | Deleted | | | <- | | UNDO | | | 606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // +-+----+----------------+-+--+----+-+------+--+-+ 616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 4 16 1 12 32 8 16 4 626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public UndoBarView(Context context) { 637817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mBarHeight = GalleryUtils.dpToPixel(48); 647817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mBarMargin = GalleryUtils.dpToPixel(4); 657817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mUndoTextMargin = GalleryUtils.dpToPixel(16); 667817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mIconMargin = GalleryUtils.dpToPixel(8); 677817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mIconSize = GalleryUtils.dpToPixel(32); 687817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mSeparatorRightMargin = GalleryUtils.dpToPixel(12); 697817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mSeparatorTopMargin = GalleryUtils.dpToPixel(10); 707817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mSeparatorBottomMargin = GalleryUtils.dpToPixel(10); 717817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mSeparatorWidth = GalleryUtils.dpToPixel(1); 727817979db0c52ffeacb951625b1e821eba303285Ahbong Chang mDeletedTextMargin = GalleryUtils.dpToPixel(16); 736b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mPanel = new NinePatchTexture(context, R.drawable.panel_undo_holo); 756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mUndoText = StringTexture.newInstance(context.getString(R.string.undo), 766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang GalleryUtils.dpToPixel(12), GRAY, 0, true); 776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletedText = StringTexture.newInstance( 786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang context.getString(R.string.deleted), 796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang GalleryUtils.dpToPixel(16), WHITE); 806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mUndoIcon = new ResourceTexture( 816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang context, R.drawable.ic_menu_revert_holo_dark); 826b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mClickRegion = mBarMargin + mUndoTextMargin + mUndoText.getWidth() 836b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang + mIconMargin + mIconSize + mSeparatorRightMargin; 846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 856b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 866b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void setOnClickListener(OnClickListener listener) { 876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mOnClickListener = listener; 886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang protected void onMeasure(int widthSpec, int heightSpec) { 926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang setMeasuredSize(0 /* unused */, mBarHeight); 936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 956b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang protected void render(GLCanvas canvas) { 976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang super.render(canvas); 98517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang advanceAnimation(); 99517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 100517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang canvas.save(GLCanvas.SAVE_FLAG_ALPHA); 101517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang canvas.multiplyAlpha(mAlpha); 102517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 1036b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int w = getWidth(); 1046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int h = getHeight(); 1056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mPanel.draw(canvas, mBarMargin, 0, w - mBarMargin * 2, mBarHeight); 1066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1076b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int x = w - mBarMargin; 1086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int y; 1096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang x -= mUndoTextMargin + mUndoText.getWidth(); 1116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang y = (mBarHeight - mUndoText.getHeight()) / 2; 1126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mUndoText.draw(canvas, x, y); 1136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang x -= mIconMargin + mIconSize; 1156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang y = (mBarHeight - mIconSize) / 2; 1166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mUndoIcon.draw(canvas, x, y, mIconSize, mIconSize); 1176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang x -= mSeparatorRightMargin + mSeparatorWidth; 1196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang y = mSeparatorTopMargin; 1206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang canvas.fillRect(x, y, mSeparatorWidth, 1216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mBarHeight - mSeparatorTopMargin - mSeparatorBottomMargin, GRAY); 1226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang x = mBarMargin + mDeletedTextMargin; 1246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang y = (mBarHeight - mDeletedText.getHeight()) / 2; 1256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletedText.draw(canvas, x, y); 126517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 127517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang canvas.restore(); 1286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 1296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 1316b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang protected boolean onTouch(MotionEvent event) { 1326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang switch (event.getAction()) { 1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang case MotionEvent.ACTION_DOWN: 1346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDownOnButton = inUndoButton(event); 1356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang break; 1366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang case MotionEvent.ACTION_UP: 1376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDownOnButton) { 1386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mOnClickListener != null && inUndoButton(event)) { 1396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mOnClickListener.onClick(this); 1406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 1416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDownOnButton = false; 1426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 1436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang break; 1446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang case MotionEvent.ACTION_CANCEL: 1456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDownOnButton = false; 1466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang break; 1476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 1486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang return true; 1496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 1506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // Check if the event is on the right of the separator 1526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean inUndoButton(MotionEvent event) { 1536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang float x = event.getX(); 1546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang float y = event.getY(); 1556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int w = getWidth(); 1566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang int h = getHeight(); 1576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang return (x >= w - mClickRegion && x < w && y >= 0 && y < h); 1586b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 159517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 160517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 161517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang // Alpha Animation 162517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 163517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 164517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private static final long NO_ANIMATION = -1; 165517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private static long ANIM_TIME = 200; 166517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private long mAnimationStartTime = NO_ANIMATION; 167517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private float mFromAlpha, mToAlpha; 168517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private float mAlpha; 169517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 170517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private static float getTargetAlpha(int visibility) { 171517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang return (visibility == VISIBLE) ? 1f : 0f; 172517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 173517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 1747817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 175517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang public void setVisibility(int visibility) { 176517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAlpha = getTargetAlpha(visibility); 177517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAnimationStartTime = NO_ANIMATION; 178517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang super.setVisibility(visibility); 179517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang invalidate(); 180517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 181517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 182517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang public void animateVisibility(int visibility) { 183517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang float target = getTargetAlpha(visibility); 184517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang if (mAnimationStartTime == NO_ANIMATION && mAlpha == target) return; 185517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang if (mAnimationStartTime != NO_ANIMATION && mToAlpha == target) return; 186517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 187517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mFromAlpha = mAlpha; 188517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mToAlpha = target; 189517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAnimationStartTime = AnimationTime.startTime(); 190517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 191517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang super.setVisibility(VISIBLE); 192517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang invalidate(); 193517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 194517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 195517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang private void advanceAnimation() { 196517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang if (mAnimationStartTime == NO_ANIMATION) return; 197517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 198517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang float delta = (float) (AnimationTime.get() - mAnimationStartTime) / 199517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang ANIM_TIME; 200517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAlpha = mFromAlpha + ((mToAlpha > mFromAlpha) ? delta : -delta); 201517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAlpha = Utils.clamp(mAlpha, 0f, 1f); 202517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang 203517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang if (mAlpha == mToAlpha) { 204517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang mAnimationStartTime = NO_ANIMATION; 205517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang if (mAlpha == 0) { 206517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang super.setVisibility(INVISIBLE); 207517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 208517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 209517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang invalidate(); 210517e1bd25305d4e82d101a8c06be0119dde2eab3Chih-Chung Chang } 2116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang} 212