Java 为谷歌定制布局';s SlidengTastrip库

Java 为谷歌定制布局';s SlidengTastrip库,java,android,android-layout,Java,Android,Android Layout,因此,谷歌将SlidengTastrip作为开源库包含在Android Studio样本集中: class SlidingTabStrip extends LinearLayout { private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0; private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26; private static final

因此,谷歌将SlidengTastrip作为开源库包含在Android Studio样本集中:

class SlidingTabStrip extends LinearLayout {

private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0;
private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 3;
private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5;

private final int mBottomBorderThickness;
private final Paint mBottomBorderPaint;

private final int mSelectedIndicatorThickness;
private final Paint mSelectedIndicatorPaint;

private final int mDefaultBottomBorderColor;

private int mSelectedPosition;
private float mSelectionOffset;

private SlidingTabLayout.TabColorizer mCustomTabColorizer;
private final SimpleTabColorizer mDefaultTabColorizer;

SlidingTabStrip(Context context) {
    this(context, null);
}

SlidingTabStrip(Context context, AttributeSet attrs) {
    super(context, attrs);
    setWillNotDraw(false);

    final float density = getResources().getDisplayMetrics().density;

    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true);
    final int themeForegroundColor =  outValue.data;

    mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor,
            DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);

    mDefaultTabColorizer = new SimpleTabColorizer();
    mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR);

    mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density);
    mBottomBorderPaint = new Paint();
    mBottomBorderPaint.setColor(mDefaultBottomBorderColor);

    mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density);
    mSelectedIndicatorPaint = new Paint();
}

void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) {
    mCustomTabColorizer = customTabColorizer;
    invalidate();
}

void setSelectedIndicatorColors(int... colors) {
    // Make sure that the custom colorizer is removed
    mCustomTabColorizer = null;
    mDefaultTabColorizer.setIndicatorColors(colors);
    invalidate();
}

void onViewPagerPageChanged(int position, float positionOffset) {
    mSelectedPosition = position;
    mSelectionOffset = positionOffset;
    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    final int height = getHeight();
    final int childCount = getChildCount();
    final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null
            ? mCustomTabColorizer
            : mDefaultTabColorizer;

    // Thick colored underline below the current selection
    if (childCount > 0) {
        View selectedTitle = getChildAt(mSelectedPosition);
        int left = selectedTitle.getLeft();
        int right = selectedTitle.getRight();
        int color = tabColorizer.getIndicatorColor(mSelectedPosition);

        if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) {
            int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1);
            if (color != nextColor) {
                color = blendColors(nextColor, color, mSelectionOffset);
            }

            // 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);
        }

        mSelectedIndicatorPaint.setColor(color);

        canvas.drawRect(left, height - mSelectedIndicatorThickness, right,
                height, mSelectedIndicatorPaint);
    }

    // Thin underline along the entire bottom edge
    canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint);
}

/**
 * Set the alpha value of the {@code color} to be the given {@code alpha} value.
 */
private static int setColorAlpha(int color, byte alpha) {
    return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
}

/**
 * Blend {@code color1} and {@code color2} using the given ratio.
 *
 * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
 *              0.0 will return {@code color2}.
 */
private static int blendColors(int color1, int color2, float ratio) {
    final float inverseRation = 1f - ratio;
    float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
    float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
    float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
    return Color.rgb((int) r, (int) g, (int) b);
}

private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer {
    private int[] mIndicatorColors;

    @Override
    public final int getIndicatorColor(int position) {
        return mIndicatorColors[position % mIndicatorColors.length];
    }

    void setIndicatorColors(int... colors) {
        mIndicatorColors = colors;
    }
}
}
class slidengTastrip扩展了线性布局{
私有静态最终整数默认值\底部\边界\厚度\倾角=0;
私有静态最终字节默认值\u底部\u边框\u颜色\u ALPHA=0x26;
选择的专用静态最终int_指示器_厚度_倾角=3;
专用静态最终整数默认值所选指示器颜色=0xFF33B5E5;
私人终审法院审理此案;
私人最终油漆MBOTOMBORDERPAINT;
私人最终int M选定的指示物厚度;
私人最终油漆M选择指示油漆;
私有最终整数mDefaultBottomBorderColor;
私人int mSelectedPosition;
私人浮动补偿;
private slidengtablayout.TabColorizer mCustomTabColorizer;
专用最终SimpleTabColorizer mDefaultTabColorizer;
SlidengAbstrip(上下文){
这个(上下文,空);
}
SlidengAbstrip(上下文,属性集属性){
超级(上下文,attrs);
setWillNotDraw(假);
最终浮点密度=getResources().getDisplayMetrics().density;
TypedValue outValue=新的TypedValue();
context.getTheme().resolveAttribute(R.attr.colorForeground,outValue,true);
final int themeForgroundColor=outValue.data;
mDefaultBottomBorderColor=setColorAlpha(最前面的颜色,
默认值(底部、边框、颜色、ALPHA);
mDefaultTabColorizer=新的SimpleTabColorizer();
mDefaultTabColorizer.SetIndicatorColor(默认选中的指示器颜色);
mBottomBorderThickness=(int)(默认值为底部、边界、厚度、倾角*密度);
mBottomBorderPaint=新油漆();
mBottomBorderPaint.setColor(mDefaultBottomBorderColor);
mselectedIndicator厚度=(int)(所选指标厚度倾角*密度);
mSelectedIndicatorPaint=新油漆();
}
void setCustomTabColorizer(SlidingTabLayout.TabColorizer自定义TabColorizer){
mCustomTabColorizer=customTabColorizer;
使无效();
}
无效设置所选指示颜色(整数…颜色){
//确保已删除自定义着色程序
mCustomTabColorizer=null;
mDefaultTabColorizer.setIndicatorColors(颜色);
使无效();
}
无效onViewPagerPageChanged(整型位置、浮动位置偏移){
mSelectedPosition=位置;
mSelectionOffset=位置偏移;
使无效();
}
@凌驾
受保护的void onDraw(画布){
最终整数高度=getHeight();
final int childCount=getChildCount();
最后一个幻灯片tablayout.TabColorizer TabColorizer=mCustomTabColorizer!=null
?mCustomTabColorizer
:mDefaultTabColorizer;
//当前选定内容下方的粗彩色下划线
如果(childCount>0){
查看selectedTitle=getChildAt(mSelectedPosition);
int left=selectedTitle.getLeft();
int right=selectedTitle.getRight();
int color=tabColorizer.getIndicatorColor(mSelectedPosition);
如果(mSelectionOffset>0f&&mSelectedPosition<(getChildCount()-1)){
int-nextColor=tabColorizer.getIndicatorColor(mSelectedPosition+1);
if(颜色!=nextColor){
颜色=混合颜色(nextColor、color、mSelectionOffset);
}
//在选项卡之间的中间绘制所选内容
视图nextitle=getChildAt(mSelectedPosition+1);
left=(int)(mSelectionOffset*nextitle.getLeft()+
(1.0f-最小选择偏移)*左);
right=(int)(mSelectionOffset*nextitle.getRight()+
(1.0f-最小选择偏移)*右侧);
}
mSelectedIndicatorPaint.setColor(颜色);
canvas.drawRect(左,高度-米选定指示厚度,右,
高度,m选择指示灯(油漆);
}
//沿整个底边添加细下划线
drawRect(0,高度-mBottomBorderThickness,getWidth(),高度,mBottomBorderPaint);
}
/**
*将{@code color}的alpha值设置为给定的{@code alpha}值。
*/
私有静态int-setColorAlpha(int-color,字节alpha){
返回Color.argb(alpha,Color.red(Color),Color.green(Color),Color.blue(Color));
}
/**
*使用给定的比率混合{@code color1}和{@code color2}。
*
*@param ratio of which to blend.1.0将返回{@code color1},0.5将给出均匀混合,
*0.0将返回{@code color2}。
*/
专用静态整型混合颜色(整型颜色1、整型颜色2、浮动比率){
最终浮点数反转=1f-比率;
浮点数r=(颜色.红色(颜色1)*比率)+(颜色.红色(颜色2)*反转);
浮点数g=(颜色.绿色(颜色1)*比率)+(颜色.绿色(颜色2)*反转);
浮点数b=(颜色.蓝色(颜色1)*比率)+(颜色.蓝色(颜色2)*反转);
返回颜色.rgb((int)r,(int)g,(int)b);
}
私有静态类SimpleTabColorizer实现SlidingTableLayout.TabColorizer{
私人室内色彩;
@凌驾
公共最终int getIndicatorColor(int位置){
返回mIndicatorColors[位置%mIndicatorColors.length];
}
无效设置指示器颜色(内部…颜色){
MindItatorColors=颜色;
}
}
}
使用其布局文件:

<com.example.SlidingTabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#000" /> 

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>


您可以更改类本身的边框厚度、颜色或其他属性:

class SlidingTabStrip extends LinearLayout {

private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2;
private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8;
private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5;

private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1;
private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20;
private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f;
根据您的要求

颜色代码为
hex
格式

例如(如何更改指示器颜色):


选中

我想避免更改我在问题中提到的库代码,在这种情况下,您可以使用,这是定制,但这是一个与我所问的完全不同的库,更改此特定库不是我的选择
class SlidingTabStrip extends LinearLayout {
// change the strip color
private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5;
...
}