1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Rect; 21a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millarimport android.util.TypedValue; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 23a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas; 24a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.NinePatchTexture; 25a4eae1abb4f2547dfbda84301ee764ce35464881John Reck 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ScrollBarView extends GLView { 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "ScrollBarView"; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mBarHeight; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripHeight; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripPosition; // left side of the grip 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripWidth; // zero if the grip is disabled 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGivenGripWidth; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentPosition; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentTotal; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private NinePatchTexture mScrollBarTexture; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ScrollBarView(Context context, int gripHeight, int gripWidth) { 43a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar TypedValue outValue = new TypedValue(); 44a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar context.getTheme().resolveAttribute( 45a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar android.R.attr.scrollbarThumbHorizontal, outValue, true); 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mScrollBarTexture = new NinePatchTexture( 47a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar context, outValue.resourceId); 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = 0; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = 0; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGivenGripWidth = gripWidth; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripHeight = gripHeight; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!changed) return; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBarHeight = bottom - top; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // The content position is between 0 to "total". The current position is 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // in "position". 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setContentPosition(int position, int total) { 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (position == mContentPosition && total == mContentTotal) { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin invalidate(); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentPosition = position; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentTotal = total; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // If the grip cannot move, don't draw it. 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mContentTotal <= 0) { 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = 0; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = 0; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Map from the content range to scroll bar range. 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mContentTotal --> getWidth() - mGripWidth 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mContentPosition --> mGripPosition 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = mGivenGripWidth; 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin float r = (getWidth() - mGripWidth) / (float) mContentTotal; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = Math.round(r * mContentPosition); 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGripWidth == 0) return; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Rect b = bounds(); 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int y = (mBarHeight - mGripHeight) / 2; 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mScrollBarTexture.draw(canvas, mGripPosition, y, mGripWidth, mGripHeight); 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 98