/* * Copyright (C) 2011 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.browser; import com.android.browser.view.HorizontalScrollView; import android.content.Context; import android.database.DataSetObserver; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; /** * custom view for displaying tabs in the nav screen */ public class NavTabScroller extends HorizontalScrollView { private static final float DEFAULT_ALPHA = 0.5f; private LinearLayout mContentView; private int mSelected; private BaseAdapter mAdapter; private boolean mSnapScroll; public NavTabScroller(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } public NavTabScroller(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public NavTabScroller(Context context) { super(context); init(context); } private void init(Context ctx) { setHorizontalScrollBarEnabled(false); mContentView = new LinearLayout(ctx); mContentView.setOrientation(LinearLayout.HORIZONTAL); int pad = ctx.getResources().getDimensionPixelSize(R.dimen.nav_scroller_padding); mContentView.setPadding(pad, 0, pad, 0); mContentView.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); addView(mContentView); mSelected = -1; } protected void setAdapter(BaseAdapter adapter) { mAdapter = adapter; mAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { super.onChanged(); populateList(); } @Override public void onInvalidated() { super.onInvalidated(); } }); populateList(); } protected void setSelection(int ix) { mSelected = ix; updateViewAlpha(); } private void updateViewAlpha() { final int n = mContentView.getChildCount(); for (int i = 0; i < n; i ++) { View v = mContentView.getChildAt(i); v.setAlpha((i == mSelected) ? 1.0f : DEFAULT_ALPHA); } } protected int getSelectionIndex() { return mSelected; } protected Tab getSelectedItem() { return (Tab) mAdapter.getItem(mSelected); } protected ViewGroup getContentView() { return mContentView; } private void populateList() { clearTabs(); for (int i = 0; i < mAdapter.getCount(); i++) { View v = mAdapter.getView(i, null, mContentView); mContentView.addView(v); v.setAlpha((i == mSelected) ? 1.0f : DEFAULT_ALPHA); } } View getSelectedTab() { if ((mSelected >= 0) && (mSelected < mContentView.getChildCount())) { return mContentView.getChildAt(mSelected); } else { return null; } } void clearTabs() { for (int i = 0; i < mContentView.getChildCount(); i++) { ViewGroup vg = (ViewGroup) mContentView.getChildAt(i); vg.removeViewAt(0); } mContentView.removeAllViews(); } protected void onScrollChanged(int sl, int st, int ol, int ot) { int midx = getScrollX() + getWidth() / 2; int sel = -1; for (int i = 0; i < mContentView.getChildCount(); i++) { View child = mContentView.getChildAt(i); if (child.getLeft() < midx && child.getRight() > midx) { sel = i; break; } } if (sel != -1 && sel != mSelected) { setSelection(sel); } } @Override public boolean onTouchEvent(MotionEvent evt) { boolean dragged = mIsBeingDragged; boolean result = super.onTouchEvent(evt); if (MotionEvent.ACTION_UP == evt.getActionMasked()) { if (mScroller.isFinished() && dragged) { snapToSelected(); } } return result; } @Override public void computeScroll() { super.computeScroll(); if (mScroller.isFinished() && !mIsBeingDragged) { if (!mSnapScroll) { snapToSelected(); } else { // reset snap scrolling flag mSnapScroll = false; } } } private void snapToSelected() { // snap to selected mSnapScroll = true; View v = mContentView.getChildAt(mSelected); int left = (v.getLeft() + v.getRight()) / 2; left -= getWidth() / 2; scrollTo(left,0); } }