PieStackView.java revision eb95db48b01b3db935601f25bd1a2358674b76da
1eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb/* 2eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Copyright (C) 2011 The Android Open Source Project 3eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * 4eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 5eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * you may not use this file except in compliance with the License. 6eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * You may obtain a copy of the License at 7eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * 8eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * http://www.apache.org/licenses/LICENSE-2.0 9eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * 10eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Unless required by applicable law or agreed to in writing, software 11eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 12eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * See the License for the specific language governing permissions and 14eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * limitations under the License. 15eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb */ 16eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 17eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbpackage com.android.browser.view; 18eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 19eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport com.android.browser.R; 20eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 21eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.content.Context; 22eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.graphics.Canvas; 23eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.view.View; 24eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 25eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb/** 26eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * shows views in a stack 27eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb */ 28eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbpublic class PieStackView extends BasePieView { 29eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 30eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb private static final int SLOP = 5; 31eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 32eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb private OnCurrentListener mCurrentListener; 33eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb private int mMinHeight; 34eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 35eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public interface OnCurrentListener { 36eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public void onSetCurrent(int index); 37eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 38eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 39eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public PieStackView(Context ctx) { 40eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mMinHeight = (int) ctx.getResources() 41eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb .getDimension(R.dimen.qc_tab_title_height); 42eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 43eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 44eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public void setOnCurrentListener(OnCurrentListener l) { 45eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mCurrentListener = l; 46eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 47eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 48eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb @Override 49eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public void setCurrent(int ix) { 50eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb super.setCurrent(ix); 51eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb if (mCurrentListener != null) { 52eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mCurrentListener.onSetCurrent(ix); 53eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb buildViews(); 54eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb layoutChildrenLinear(); 55eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 56eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 57eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 58eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb /** 59eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * this will be called before the first draw call 60eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb */ 61eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb @Override 62eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public void layout(int anchorX, int anchorY, boolean left) { 63eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb super.layout(anchorX, anchorY, left); 64eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb buildViews(); 65eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mWidth = mChildWidth; 66eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mHeight = mChildHeight + (mViews.size() - 1) * mMinHeight; 67eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mLeft = anchorX + (left ? SLOP : -(SLOP + mChildWidth)); 68eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb mTop = anchorY - mHeight / 2; 69eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb if (mViews != null) { 70eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb layoutChildrenLinear(); 71eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 72eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 73eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 74eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb private void layoutChildrenLinear() { 75eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb final int n = mViews.size(); 76eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb int top = mTop; 77eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb int dy = (n == 1) ? 0 : (mHeight - mChildHeight) / (n - 1); 78eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb for (View view : mViews) { 79eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb view.layout(mLeft, top, mLeft + mChildWidth, top + mChildHeight); 80eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb top += dy; 81eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 82eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 83eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 84eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb @Override 85eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb public void draw(Canvas canvas) { 86eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb if (mViews != null) { 87eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb final int n = mViews.size(); 88eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb for (int i = 0; i < mCurrent; i++) { 89eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb drawView(mViews.get(i), canvas); 90eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 91eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb for (int i = n - 1; i > mCurrent; i--) { 92eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb drawView(mViews.get(i), canvas); 93eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 94eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb drawView(mViews.get(mCurrent), canvas); 95eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 96eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 97eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 98eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb @Override 99eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb protected int findChildAt(int y) { 100eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb final int ix = (y - mTop) * mViews.size() / mHeight; 101eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb return ix; 102eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb } 103eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb 104eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb} 105