| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.gallery3d.ui; |
| |
| import android.content.Context; |
| import android.graphics.Rect; |
| import android.util.TypedValue; |
| |
| import com.android.gallery3d.glrenderer.GLCanvas; |
| import com.android.gallery3d.glrenderer.NinePatchTexture; |
| |
| public class ScrollBarView extends GLView { |
| @SuppressWarnings("unused") |
| private static final String TAG = "ScrollBarView"; |
| |
| private int mBarHeight; |
| |
| private int mGripHeight; |
| private int mGripPosition; // left side of the grip |
| private int mGripWidth; // zero if the grip is disabled |
| private int mGivenGripWidth; |
| |
| private int mContentPosition; |
| private int mContentTotal; |
| |
| private NinePatchTexture mScrollBarTexture; |
| |
| public ScrollBarView(Context context, int gripHeight, int gripWidth) { |
| TypedValue outValue = new TypedValue(); |
| context.getTheme().resolveAttribute( |
| android.R.attr.scrollbarThumbHorizontal, outValue, true); |
| mScrollBarTexture = new NinePatchTexture( |
| context, outValue.resourceId); |
| mGripPosition = 0; |
| mGripWidth = 0; |
| mGivenGripWidth = gripWidth; |
| mGripHeight = gripHeight; |
| } |
| |
| @Override |
| protected void onLayout( |
| boolean changed, int left, int top, int right, int bottom) { |
| if (!changed) return; |
| mBarHeight = bottom - top; |
| } |
| |
| // The content position is between 0 to "total". The current position is |
| // in "position". |
| public void setContentPosition(int position, int total) { |
| if (position == mContentPosition && total == mContentTotal) { |
| return; |
| } |
| |
| invalidate(); |
| |
| mContentPosition = position; |
| mContentTotal = total; |
| |
| // If the grip cannot move, don't draw it. |
| if (mContentTotal <= 0) { |
| mGripPosition = 0; |
| mGripWidth = 0; |
| return; |
| } |
| |
| // Map from the content range to scroll bar range. |
| // |
| // mContentTotal --> getWidth() - mGripWidth |
| // mContentPosition --> mGripPosition |
| mGripWidth = mGivenGripWidth; |
| float r = (getWidth() - mGripWidth) / (float) mContentTotal; |
| mGripPosition = Math.round(r * mContentPosition); |
| } |
| |
| @Override |
| protected void render(GLCanvas canvas) { |
| super.render(canvas); |
| if (mGripWidth == 0) return; |
| Rect b = bounds(); |
| int y = (mBarHeight - mGripHeight) / 2; |
| mScrollBarTexture.draw(canvas, mGripPosition, y, mGripWidth, mGripHeight); |
| } |
| } |