summaryrefslogtreecommitdiffstats
path: root/src/com/android/browser/TabBar.java
diff options
context:
space:
mode:
authorMichael Kolb <kolby@google.com>2010-12-09 14:13:42 -0800
committerMichael Kolb <kolby@google.com>2010-12-10 10:52:31 -0800
commit2b5a13ab55991f55ab7afb107e4401c6fbb5ad64 (patch)
tree0e36134395601aafdcca397eb09de973ff9c8d71 /src/com/android/browser/TabBar.java
parent0ebd3ac69a76ec76d9caab65a1947f971242994e (diff)
downloadandroid_packages_apps_Gello-2b5a13ab55991f55ab7afb107e4401c6fbb5ad64.tar.gz
android_packages_apps_Gello-2b5a13ab55991f55ab7afb107e4401c6fbb5ad64.tar.bz2
android_packages_apps_Gello-2b5a13ab55991f55ab7afb107e4401c6fbb5ad64.zip
New tab rendering
Rendering tabs from a fixed background asset Change-Id: Ic02ed0c059486c2bb8157f19012f98099bf7e75a
Diffstat (limited to 'src/com/android/browser/TabBar.java')
-rw-r--r--src/com/android/browser/TabBar.java116
1 files changed, 107 insertions, 9 deletions
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 14b18458..4f179b08 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -22,7 +22,13 @@ import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
@@ -74,6 +80,17 @@ public class TabBar extends LinearLayout
private Drawable mGenericFavicon;
private String mLoadingText;
+ private Drawable mActiveDrawable;
+ private Drawable mInactiveDrawable;
+
+ private Bitmap mShaderBuffer;
+ private Canvas mShaderCanvas;
+ private Paint mShaderPaint;
+ private int mTabHeight;
+ private int mTabOverlap;
+ private int mTabSliceWidth;
+ private int mTabPadding;
+
public TabBar(Activity activity, UiController controller, BaseUi ui) {
super(activity);
mActivity = activity;
@@ -83,16 +100,20 @@ public class TabBar extends LinearLayout
Resources res = activity.getResources();
mTabWidthSelected = (int) res.getDimension(R.dimen.tab_width_selected);
mTabWidthUnselected = (int) res.getDimension(R.dimen.tab_width_unselected);
+ mActiveDrawable = res.getDrawable(R.drawable.bg_urlbar);
+ mInactiveDrawable = res.getDrawable(R.drawable.browsertab_inactive);
mTabMap = new HashMap<Tab, TabViewData>();
Resources resources = activity.getResources();
LayoutInflater factory = LayoutInflater.from(activity);
factory.inflate(R.layout.tab_bar, this);
+ setPadding(12, 12, 0, 0);
mTabs = (TabScrollView) findViewById(R.id.tabs);
mNewTab = (ImageButton) findViewById(R.id.newtab);
mNewTab.setOnClickListener(this);
mGenericFavicon = res.getDrawable(R.drawable.app_web_browser_sm);
mLoadingText = res.getString(R.string.title_bar_loading);
+ setChildrenDrawingOrderEnabled(true);
// TODO: Change enabled states based on whether you can go
// back/forward. Probably should be done inside onPageStarted.
@@ -102,6 +123,22 @@ public class TabBar extends LinearLayout
mUserRequestedUrlbar = false;
mTitleVisible = true;
mButtonWidth = -1;
+ // tab dimensions
+ mTabHeight = (int) res.getDimension(R.dimen.tab_height);
+ mTabOverlap = (int) res.getDimension(R.dimen.tab_overlap);
+ mTabSliceWidth = (int) res.getDimension(R.dimen.tab_slice);
+ mTabPadding = (int) res.getDimension(R.dimen.tab_padding);
+ int maxTabWidth = (int) res.getDimension(R.dimen.max_tab_width);
+ // shader initialization
+ mShaderBuffer = Bitmap.createBitmap(maxTabWidth, mTabHeight,
+ Bitmap.Config.ARGB_8888);
+ mShaderCanvas = new Canvas(mShaderBuffer);
+ mShaderPaint = new Paint();
+ BitmapShader shader = new BitmapShader(mShaderBuffer,
+ Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+ mShaderPaint.setShader(shader);
+ mShaderPaint.setStyle(Paint.Style.FILL);
+ mShaderPaint.setAntiAlias(true);
}
void updateTabs(List<Tab> tabs) {
@@ -115,17 +152,31 @@ public class TabBar extends LinearLayout
}
@Override
+ protected void onMeasure(int hspec, int vspec) {
+ super.onMeasure(hspec, vspec);
+ int w = getMeasuredWidth();
+ // adjust for new tab overlap
+ w -= mTabOverlap;
+ setMeasuredDimension(w, getMeasuredHeight());
+ }
+
+ @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ // use paddingLeft and paddingTop
+ int pl = getPaddingLeft();
+ int pt = getPaddingTop();
if (mButtonWidth == -1) {
- mButtonWidth = mNewTab.getMeasuredWidth();
+ mButtonWidth = mNewTab.getMeasuredWidth() - mTabOverlap;
}
int sw = mTabs.getMeasuredWidth();
- int w = right-left;
+ int w = right - left - pl;
if (w-sw < mButtonWidth) {
sw = w - mButtonWidth;
}
- mTabs.layout(0, 0, sw, bottom-top );
- mNewTab.layout(sw, 0, sw+mButtonWidth, bottom-top);
+ mTabs.layout(pl, pt, pl + sw, bottom - top);
+ // adjust for overlap
+ mNewTab.layout(pl + sw - mTabOverlap, pt,
+ pl + sw + mButtonWidth - mTabOverlap, bottom - top);
}
public void onClick(View view) {
@@ -212,6 +263,12 @@ public class TabBar extends LinearLayout
return tv;
}
+ @Override
+ protected int getChildDrawingOrder(int count, int i) {
+ // reverse
+ return count - 1 - i;
+ }
+
/**
* View used in the tab bar
*/
@@ -226,16 +283,21 @@ public class TabBar extends LinearLayout
ImageView mClose;
boolean mSelected;
boolean mInLoad;
+ Path mPath;
+ int[] mWindowPos;
/**
* @param context
*/
public TabView(Context context, TabViewData tab) {
super(context);
+ setWillNotDraw(false);
+ mPath = new Path();
+ mWindowPos = new int[2];
mTabData = tab;
setGravity(Gravity.CENTER_VERTICAL);
setOrientation(LinearLayout.HORIZONTAL);
- setBackgroundResource(R.drawable.tab_background);
+ setPadding(0, 0, mTabPadding, 0);
LayoutInflater inflater = LayoutInflater.from(getContext());
mTabContent = inflater.inflate(R.layout.tab_title, this, true);
mTitle = (TextView) mTabContent.findViewById(R.id.title);
@@ -286,11 +348,11 @@ public class TabBar extends LinearLayout
mTitle.setTextAppearance(mActivity, mSelected ?
R.style.TabTitleSelected : R.style.TabTitleUnselected);
setHorizontalFadingEdgeEnabled(!mSelected);
- setFadingEdgeLength(50);
super.setActivated(selected);
- setLayoutParams(new LayoutParams(selected ?
- mTabWidthSelected : mTabWidthUnselected,
- LayoutParams.MATCH_PARENT));
+ LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
+ lp.width = selected ? mTabWidthSelected : mTabWidthUnselected;
+ lp.height = LayoutParams.MATCH_PARENT;
+ setLayoutParams(lp);
}
void setDisplayTitle(String title) {
@@ -328,6 +390,42 @@ public class TabBar extends LinearLayout
}
}
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ setTabPath(mPath, 0, 0, r - l, b - t);
+ }
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ int state = canvas.save();
+ int[] pos = new int[2];
+ getLocationInWindow(mWindowPos);
+ Drawable drawable = mSelected ? mActiveDrawable : mInactiveDrawable;
+ drawable.setBounds(0, 0, mUi.getTitleBarWidth(), getHeight());
+ drawClipped(canvas, drawable, mPath, mWindowPos[0]);
+ canvas.restoreToCount(state);
+ super.dispatchDraw(canvas);
+ }
+
+ private void drawClipped(Canvas canvas, Drawable drawable,
+ Path clipPath, int left) {
+ mShaderCanvas.drawColor(Color.TRANSPARENT);
+ mShaderCanvas.translate(-left, 0);
+ drawable.draw(mShaderCanvas);
+ canvas.drawPath(clipPath, mShaderPaint);
+ mShaderCanvas.translate(left, 0);
+ }
+
+ private void setTabPath(Path path, int l, int t, int r, int b) {
+ path.reset();
+ path.moveTo(l, b);
+ path.lineTo(l, t);
+ path.lineTo(r - mTabSliceWidth, t);
+ path.lineTo(r, b);
+ path.close();
+ }
+
}
/**