diff options
Diffstat (limited to 'src/com/android/launcher3/views/SlidingTabStrip.java')
-rw-r--r-- | src/com/android/launcher3/views/SlidingTabStrip.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/com/android/launcher3/views/SlidingTabStrip.java b/src/com/android/launcher3/views/SlidingTabStrip.java new file mode 100644 index 000000000..45c626146 --- /dev/null +++ b/src/com/android/launcher3/views/SlidingTabStrip.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2017 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.launcher3.views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import com.android.launcher3.R; +import com.android.launcher3.util.Themes; + +public class SlidingTabStrip extends LinearLayout { + + private final Paint mSelectedIndicatorPaint; + private int mSelectedIndicatorHeight; + private int mIndicatorLeft = -1; + private int mIndicatorRight = -1; + private int mSelectedPosition = -1; + private float mSelectionOffset; + + public SlidingTabStrip(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + setOrientation(HORIZONTAL); + setWillNotDraw(false); + mSelectedIndicatorPaint = new Paint(); + mSelectedIndicatorPaint.setColor(Themes.getAttrColor(context, android.R.attr.colorAccent)); + mSelectedIndicatorHeight = getResources() + .getDimensionPixelSize(R.dimen.all_apps_tabs_indicator_height); + } + + public void updateIndicatorPosition(int position, float positionOffset) { + mSelectedPosition = position; + mSelectionOffset = positionOffset; + updateIndicatorPosition(); + } + + public void updateTabTextColor(int pos) { + for (int i=0; i < getChildCount(); i++) { + Button tab = (Button) getChildAt(i); + tab.setSelected(i == pos); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + updateTabTextColor(0); + updateIndicatorPosition(0, 0); + } + + private void updateIndicatorPosition() { + final View tab = getChildAt(mSelectedPosition); + int left, right; + + if (tab != null && tab.getWidth() > 0) { + left = tab.getLeft(); + right = tab.getRight(); + + if (mSelectionOffset > 0f && mSelectedPosition < getChildCount() - 1) { + // Draw the selection partway between the tabs + View nextTitle = getChildAt(mSelectedPosition + 1); + left = (int) (mSelectionOffset * nextTitle.getLeft() + + (1.0f - mSelectionOffset) * left); + right = (int) (mSelectionOffset * nextTitle.getRight() + + (1.0f - mSelectionOffset) * right); + } + } else { + left = right = -1; + } + + setIndicatorPosition(left, right); + } + + private void setIndicatorPosition(int left, int right) { + if (left != mIndicatorLeft || right != mIndicatorRight) { + mIndicatorLeft = left; + mIndicatorRight = right; + invalidate(); + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight, + mIndicatorRight, getHeight(), mSelectedIndicatorPaint); + } +}
\ No newline at end of file |