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 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ScrollBarView extends GLView { 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "ScrollBarView"; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mBarHeight; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripHeight; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripPosition; // left side of the grip 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGripWidth; // zero if the grip is disabled 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mGivenGripWidth; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentPosition; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentTotal; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private NinePatchTexture mScrollBarTexture; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ScrollBarView(Context context, int gripHeight, int gripWidth) { 40a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar TypedValue outValue = new TypedValue(); 41a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar context.getTheme().resolveAttribute( 42a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar android.R.attr.scrollbarThumbHorizontal, outValue, true); 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mScrollBarTexture = new NinePatchTexture( 44a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar context, outValue.resourceId); 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = 0; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = 0; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGivenGripWidth = gripWidth; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripHeight = gripHeight; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!changed) return; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBarHeight = bottom - top; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // The content position is between 0 to "total". The current position is 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // in "position". 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setContentPosition(int position, int total) { 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (position == mContentPosition && total == mContentTotal) { 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin invalidate(); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentPosition = position; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentTotal = total; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // If the grip cannot move, don't draw it. 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mContentTotal <= 0) { 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = 0; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = 0; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Map from the content range to scroll bar range. 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mContentTotal --> getWidth() - mGripWidth 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mContentPosition --> mGripPosition 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripWidth = mGivenGripWidth; 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin float r = (getWidth() - mGripWidth) / (float) mContentTotal; 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGripPosition = Math.round(r * mContentPosition); 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGripWidth == 0) return; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Rect b = bounds(); 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int y = (mBarHeight - mGripHeight) / 2; 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mScrollBarTexture.draw(canvas, mGripPosition, y, mGripWidth, mGripHeight); 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 95