FileDocCategorySizeDatePackage
InternalSelectionView.javaAPI DocAndroid 1.5 API8516Wed May 06 22:41:08 BST 2009com.example.android.apis.view

InternalSelectionView

public class InternalSelectionView extends android.view.View
A view that has a known number of selectable rows, and maintains a notion of which row is selected. The rows take up the entire width of the view. The height of the view is divided evenly among the rows. Notice what this view does to be a good citizen w.r.t its internal selection: 1) calls {@link View#requestRectangleOnScreen} each time the selection changes due to internal navigation. 2) overrides {@link View#getFocusedRect} by filling in the rectangle of the currently selected row 3) overrides {@link View#onFocusChanged} and sets selection appropriately according to the previously focused rectangle.

Fields Summary
private android.graphics.Paint
mPainter
private android.graphics.Paint
mTextPaint
private android.graphics.Rect
mTempRect
private int
mNumRows
private int
mSelectedRow
private final int
mEstimatedPixelHeight
private Integer
mDesiredHeight
private String
mLabel
Constructors Summary
public InternalSelectionView(android.content.Context context, int numRows)



         
        this(context, numRows, "");
    
public InternalSelectionView(android.content.Context context, int numRows, String label)

        super(context);
        mNumRows = numRows;
        mLabel = label;
        init();
    
public InternalSelectionView(android.content.Context context, android.util.AttributeSet attrs)

        super(context, attrs);
        init();
    
Methods Summary
voidensureRectVisible()

        getRectForRow(mTempRect, mSelectedRow);
        requestRectangleOnScreen(mTempRect);
    
public voidgetFocusedRect(android.graphics.Rect r)

        getRectForRow(r, mSelectedRow);
    
public java.lang.StringgetLabel()

        return mLabel;
    
public intgetNumRows()

        return mNumRows;
    
public voidgetRectForRow(android.graphics.Rect rect, int row)

        final int rowHeight = getRowHeight();
        final int top = getPaddingTop() + row * rowHeight;
        rect.set(getPaddingLeft(),
                top,
                getWidth() - getPaddingRight(),
                top + rowHeight);
    
private intgetRowHeight()

        return (getHeight() - getPaddingTop() - getPaddingBottom()) / mNumRows;
    
public intgetSelectedRow()

        return mSelectedRow;
    
private voidinit()

        setFocusable(true);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(10);
        mTextPaint.setColor(Color.WHITE);
    
private intmeasureHeight(int measureSpec)

        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        int desiredHeight = mDesiredHeight != null ?
                mDesiredHeight :
                mNumRows * mEstimatedPixelHeight + getPaddingTop() + getPaddingBottom();
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            return specSize;
        } else if (specMode == MeasureSpec.AT_MOST) {
            return desiredHeight < specSize ? desiredHeight : specSize;
        } else {
            return desiredHeight;
        }
    
private intmeasureWidth(int measureSpec)

        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        int desiredWidth = 300 + getPaddingLeft() + getPaddingRight();
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            return specSize;
        } else if (specMode == MeasureSpec.AT_MOST) {
            return desiredWidth < specSize ? desiredWidth : specSize;
        } else {
            return desiredWidth;
        }
    
protected voidonDraw(android.graphics.Canvas canvas)


        int rowHeight = getRowHeight();

        int rectTop = getPaddingTop();
        int rectLeft = getPaddingLeft();
        int rectRight = getWidth() - getPaddingRight();
        for (int i = 0; i < mNumRows; i++) {

            mPainter.setColor(Color.BLACK);
            mPainter.setAlpha(0x20);

            // draw background rect
            mTempRect.set(rectLeft, rectTop, rectRight, rectTop + rowHeight);
            canvas.drawRect(mTempRect, mPainter);

            // draw forground rect
            if (i == mSelectedRow && hasFocus()) {
                mPainter.setColor(Color.RED);
                mPainter.setAlpha(0xF0);
                mTextPaint.setAlpha(0xFF);
            } else {
                mPainter.setColor(Color.BLACK);
                mPainter.setAlpha(0x40);
                mTextPaint.setAlpha(0xF0);
            }
            mTempRect.set(rectLeft + 2, rectTop + 2,
                    rectRight - 2, rectTop + rowHeight - 2);
            canvas.drawRect(mTempRect, mPainter);

            // draw text to help when visually inspecting
            canvas.drawText(
                    Integer.toString(i),
                    rectLeft + 2,
                    rectTop + 2 - (int) mTextPaint.ascent(),
                    mTextPaint);

            rectTop += rowHeight;
        }
    
protected voidonFocusChanged(boolean focused, int direction, android.graphics.Rect previouslyFocusedRect)

        super.onFocusChanged(focused, direction, previouslyFocusedRect);

        if (focused) {
            switch (direction) {
                case View.FOCUS_DOWN:
                    mSelectedRow = 0;
                    break;
                case View.FOCUS_UP:
                    mSelectedRow = mNumRows - 1;
                    break;
                case View.FOCUS_LEFT:  // fall through
                case View.FOCUS_RIGHT:
                    // set the row that is closest to the rect
                    if (previouslyFocusedRect != null) {
                        int y = previouslyFocusedRect.top
                                + (previouslyFocusedRect.height() / 2);
                        int yPerRow = getHeight() / mNumRows;
                        mSelectedRow = y / yPerRow;
                    } else {
                        mSelectedRow = 0;
                    }
                    break;
                default:
                    // can't gleam any useful information about what internal
                    // selection should be...
                    return;
            }
            invalidate();
        }
    
public booleanonKeyDown(int keyCode, android.view.KeyEvent event)

        switch(event.getKeyCode()) {
            case KeyEvent.KEYCODE_DPAD_UP:
                if (mSelectedRow > 0) {
                    mSelectedRow--;
                    invalidate();
                    ensureRectVisible();
                    return true;
                }
                break;
            case KeyEvent.KEYCODE_DPAD_DOWN:
                if (mSelectedRow < (mNumRows - 1)) {
                    mSelectedRow++;
                    invalidate();
                    ensureRectVisible();
                    return true;
                }
                break;
        }
        return false;
    
protected voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)

        setMeasuredDimension(
            measureWidth(widthMeasureSpec),
            measureHeight(heightMeasureSpec));
    
public voidsetDesiredHeight(int desiredHeight)

        mDesiredHeight = desiredHeight;
    
public java.lang.StringtoString()

        if (mLabel != null) {
            return mLabel;
        }
        return super.toString();