转载请标明出处:
http://blog.csdn.net/xuehuayous/article/details/50924890;
本文出自:【Kevin.zhou的博客】
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 得到绘制icon的宽 int bitmapWidth = Math.min(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(), getMeasuredHeight() - getPaddingTop() - getPaddingBottom() - mTextBound.height()); int left = getMeasuredWidth() / 2 - bitmapWidth / 2; int top = (getMeasuredHeight() - mTextBound.height()) / 2 - bitmapWidth / 2; // 设置icon的绘制范围 mIconRect = new Rect(left, top, left + bitmapWidth, top + bitmapWidth); // 设置指示点的范围 int indicatorRadius = mIndicatorSize / 2; int tabRealHeight = bitmapWidth + mTextBound.height(); mIndicatorRect = new Rect(left + tabRealHeight* 4/5 - indicatorRadius, top, left+tabRealHeight* 4/5 + indicatorRadius, top + mIndicatorSize); }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); setupTargetBitmap(canvas); drawIndicator(canvas); if(null != mText) { drawTargetText(canvas); } }
/** * 绘制图标图片 * @param canvas */ private void setupTargetBitmap(Canvas canvas) { canvas.drawBitmap(isSelected ? mSelectedIconBitmap : mUnselectedIconBitmap, null, mIconRect, null); }
/** * 绘制指示点 * @param canvas */ protected void drawIndicator(Canvas canvas) { if(isIndicateDisplay) { canvas.drawBitmap(mIndicatorBitmap, null, mIndicatorRect, null); } }
/** * 绘制文字 * @param canvas */ protected void drawTargetText(Canvas canvas) { mTextPaint.setColor(isSelected ? mSelectedColor : mUnselectedColor); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int alpha = (int) Math.ceil((255 * mAlpha)); drawSourceBitmap(canvas, alpha); drawTargetBitmap(canvas, alpha); if(null != mText) { drawSourceText(canvas, alpha); drawTargetText(canvas, alpha); } drawIndicator(canvas); }
/** * 绘制未选中图标 * @param canvas * @param alpha */ private void drawSourceBitmap(Canvas canvas, int alpha) { mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setAlpha(255 - alpha); canvas.drawBitmap(mUnselectedIconBitmap, null, mIconRect, mPaint); }
/** * 绘制选中图标 * @param canvas * @param alpha */ private void drawTargetBitmap(Canvas canvas, int alpha) { mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setAlpha(alpha); canvas.drawBitmap(mSelectedIconBitmap, null, mIconRect, mPaint); }
/** * 画未选中文字 * @param canvas * @param alpha */ private void drawSourceText(Canvas canvas, int alpha) { mTextPaint.setTextSize(mTextSize); mTextPaint.setColor(mUnselectedColor); mTextPaint.setAlpha(255 - alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
/** * 画选中文字 * @param canvas * @param alpha */ private void drawTargetText(Canvas canvas, int alpha) { mTextPaint.setColor(mSelectedColor); mTextPaint.setAlpha(alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
private void setupTargetBitmap(int alpha) { mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Config.ARGB_8888); mCanvas = new Canvas(mBitmap); mPaint = new Paint(); mPaint.setColor(mSelectedColor); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setAlpha(alpha); mCanvas.drawRect(mIconRect, mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mPaint.setAlpha(255); mCanvas.drawBitmap(mIconBitmap, null, mIconRect, mPaint); }
private void drawSourceText(Canvas canvas, int alpha) { mTextPaint.setTextSize(mTextSize); mTextPaint.setColor(mUnselectedColor); mTextPaint.setAlpha(255 - alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
private void drawTargetText(Canvas canvas, int alpha) { mTextPaint.setColor(mSelectedColor); mTextPaint.setAlpha(alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
private void init(Context context, AttributeSet attrs) { setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER); //Load defaults from resources final Resources res = getResources(); final int defaultSelectedColor = res.getColor(R.color.default_tab_view_selected_color); final int defaultUnselectedColor = res.getColor(R.color.default_tab_view_unselected_color); final float defaultTextSize = res.getDimension(R.dimen.default_tab_view_text_size); final float defaultTabPadding = res.getDimension(R.dimen.default_tab_view_padding); final float defaultIndicatorSize = res.getDimension(R.dimen.default_tab_view_indicator_size); // Styleables from XML TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabIndicator); // 读取布局中,各个tab使用的文字 if (a.hasValue(R.styleable.TabIndicator_tabLabels)) { mLabels = a.getTextArray(R.styleable.TabIndicator_tabLabels); } mSelectedColor = a.getColor(R.styleable.TabIndicator_tabSelectedColor, defaultSelectedColor); mUnselectedColor = a.getColor(R.styleable.TabIndicator_tabUnselectedColor, defaultUnselectedColor); mTextSize = (int) a.getDimension(R.styleable.TabIndicator_tabTextSize, defaultTextSize); mIndicatorSize = (int) a.getDimension(R.styleable.TabIndicator_TabIndicatorSize, defaultIndicatorSize); mTabPadding = (int) a.getDimension(R.styleable.TabIndicator_tabItemPadding, defaultTabPadding); handleStyledAttributes(a); a.recycle(); initView(); }由于有些属性不是公共的,这里定义handleStyleAttributes(a)的抽象方法,在子类中去实现。
/** * 初始化控件 */ private void initView() { LayoutParams params = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1); params.gravity = Gravity.CENTER; int size = getTabSize(); for (int i = 0; i < size; i++) { final int index = i; T tabItemView = createTabView(); tabItemView.setPadding(mTabPadding, mTabPadding, mTabPadding, mTabPadding); // 图标及文字 if(null != mLabels) { tabItemView.setText(mLabels[index]); tabItemView.setTextSize(mTextSize); } tabItemView.setSelectedColor(mSelectedColor); tabItemView.setUnselectedColor(mUnselectedColor); tabItemView.setIndicatorSize(mIndicatorSize); setProperties(tabItemView, i); this.addView(tabItemView, params); tabItemView.setTag(index); // CheckedTextView设置索引作为tag,以便后续更改颜色、图片等 mCheckedList.add(tabItemView); // 将CheckedTextView添加到list中,便于操作 tabItemView.setOnClickListener(new OnClickListener() @Override public void onClick(View v) { setTabsDisplay(index); // 设置底部图片和文字的显示 if (null != mTabListener) { mTabListener.onTabSelected(index); // tab项被选中的回调事件 } } }); // 初始化 底部菜单选中状态,默认第一个选中 if (i == 0) { tabItemView.setSelected(true); } else { tabItemView.setSelected(false); } } }
/** * 生成TabView * @return */ protected abstract T createTabView(); /** * 设置特殊属性 * @param t */ protected abstract void setProperties(T t, int index);
@Override protected void handleStyledAttributes(TypedArray a) { // 读取布局中,各个tab使用的图标 int selectedIconsResId = a.getResourceId(R.styleable.TabIndicator_tabSelectedIcons, 0); TypedArray ta = getContext().getResources().obtainTypedArray(selectedIconsResId); int len = ta.length(); mSelectedDrawableIds = new int[len]; for(int i = 0; i < len; i++) { mSelectedDrawableIds[i] = ta.getResourceId(i, 0); } int unselectedIconsResId = a.getResourceId(R.styleable.TabIndicator_tabUnselectedIcons, 0); ta = getContext().getResources().obtainTypedArray(unselectedIconsResId); len = ta.length(); mUnselectedDrawableIds = new int[len]; for(int i = 0; i < len; i++) { mUnselectedDrawableIds[i] = ta.getResourceId(i, 0); } ta.recycle(); }
@Override protected TabView createTabView() { return new TabView(getContext()); }
@Override protected void setProperties(TabView tabView, int index) { tabView.setSelectedIcon(mSelectedDrawableIds[index]); tabView.setUnselectedIcon(mUnselectedDrawableIds[index]); }
@Override protected int getTabSize() { return mSelectedDrawableIds.length; }
如果您的项目使用 Gradle 构建, 只需要在您的build.gradle
文件添加下面一行到 dependencies
:
compile 'com.kevin:tabindicator:1.0.2'