package com.dreamspace.uucampus.ui.base; /** * Created by money on 2015/9/14. */ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.Looper; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import com.dreamspace.uucampus.R; public class ChangeColorTabWithText extends View { private Bitmap mBitmap; private String text; private int mColor; private int textSize; private Canvas mCanvas; private Bitmap mBitmapInMem; private Paint mPaint; private float mAlpha=0.0f; private Rect mIconRect; private Rect mTextRect; private Paint mTextPaint; public ChangeColorTabWithText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ChangeColorTabWithText(Context context) { this(context, null); } public ChangeColorTabWithText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // System.out.println("CONSTRUCT IN VIEW"); TypedArray mArray=context.obtainStyledAttributes(attrs, R.styleable.ChangeColorTabWithText); for(int i=0;i<mArray.getIndexCount();i++){ int attr=mArray.getIndex(i); switch (attr){ case R.styleable.ChangeColorTabWithText_maincolor: mColor= mArray.getColor(attr,0xFF45C01A); break; case R.styleable.ChangeColorTabWithText_drawable: BitmapDrawable drawable=(BitmapDrawable)mArray.getDrawable(attr); mBitmap=drawable.getBitmap(); break; case R.styleable.ChangeColorTabWithText_text: text=mArray.getText(attr).toString(); break; case R.styleable.ChangeColorTabWithText_textsize: textSize= (int) mArray.getDimension(attr, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics())); break; } } mArray.recycle(); mTextRect=new Rect(); mTextPaint=new Paint(); mTextPaint.setTextSize(textSize); mTextPaint.setColor(0xff555555); mTextPaint.getTextBounds(text, 0, text.length(), mTextRect); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int iconwidth=Math.min(getMeasuredWidth()-getPaddingLeft()-getPaddingRight(),getMeasuredHeight()-getPaddingBottom()-getPaddingTop()-mTextRect.height()); int left=getMeasuredWidth()/2-iconwidth/2; int top=getMeasuredHeight()/2-(iconwidth+mTextRect.height())/2; mIconRect=new Rect(left,top,left+iconwidth,top+iconwidth); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制原图 canvas.drawBitmap(mBitmap, null, mIconRect, null); int alpha= (int) Math.ceil(255*mAlpha); //初始化mBitmap,并且通过两个BITMAP的合成来获得最终的填色版本的tab icon setUpTargetBitmap(alpha); //使用view依附的画布来将上一步生成的bitmap绘制出来,由于设置了mBitmapInMem的大小是整个控件,因此在设置绘制位置的时候从(0,0)开始就好 canvas.drawBitmap(mBitmapInMem, 0, 0, null); drawSourceText(canvas, alpha); drawTargetText(canvas, alpha); } private void drawTargetText(Canvas canvas, int alpha) { mTextPaint.setColor(mColor); mTextPaint.setAlpha(alpha); canvas.drawText(text, mIconRect.left + mIconRect.width() / 2 - mTextRect.width() / 2, mIconRect.bottom + mTextRect.height(), mTextPaint); } private void drawSourceText(Canvas canvas,int alpha) { mTextPaint.setColor(0xff333333); mTextPaint.setAlpha(255 - alpha); canvas.drawText(text,mIconRect.left+mIconRect.width()/2-mTextRect.width()/2,mIconRect.bottom+mTextRect.height(),mTextPaint); } private void setUpTargetBitmap(int alpha) { //声明一个临时bitmap用于存放结果 mBitmapInMem = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888); //将结果与画布关联 mCanvas = new Canvas(mBitmapInMem); //在图标矩形区域内绘制一个纯色的填满区域,作为将要填充的bitmap,即dst bitmap mPaint = new Paint(); mPaint.setColor(mColor); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setAlpha(alpha); mCanvas.drawRect(mIconRect, mPaint); //设置当两个bitmap重叠时的处理方式。DST_IN:形状为交集形状,颜色使用dst的bitmap的颜色 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mPaint.setAlpha(255); //设置src的bitmap为用户XML中提供的bitmap,画在新声明的这个canvas中,与dst bitmap以DST_IN的方式进行重叠,最终生成的bitmap可通过mBitmapInMem来获取 mCanvas.drawBitmap(mBitmap, null, mIconRect, mPaint); } public void setIconAlpha(float alpha){ mAlpha=alpha; validateView(); } private void validateView() { if(Looper.getMainLooper()==Looper.myLooper()){ invalidate(); }else{ postInvalidate(); } } }