美文网首页
自定义view实现仿微信6.0底部导航颜色渐变效果

自定义view实现仿微信6.0底部导航颜色渐变效果

作者: 我是你森哥哥 | 来源:发表于2017-07-05 17:36 被阅读0次
    仿微信GIF.gif

    1. 自定义view

    package com.zss.weixin;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    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.Bundle;
    import android.os.Looper;
    import android.os.Parcelable;
    import android.util.AttributeSet;
    import android.util.TypedValue;
    import android.view.View;
    
    public class ChangeColorIconWithText extends View {
    
        private int mColor = 0xFFEB6100;
        private Bitmap mIconBitmap;
        private String mText = "微信";
        private int mTextSize = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics());
    
        private Canvas mCanvas;
        private Bitmap mBitmap;
        private Paint mPaint;
    
        private float mAlpha;
    
        private Rect mIconRect;
        private Rect mTextBound;
        private Paint mTextPaint;
    
        public ChangeColorIconWithText(Context context) {
            this(context, null);
        }
    
        public ChangeColorIconWithText(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        /**
         * 获取自定义属性的值
         *
         * @param context
         * @param attrs
         * @param defStyleAttr
         */
        public ChangeColorIconWithText(Context context, AttributeSet attrs,
                                       int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            TypedArray a = context.obtainStyledAttributes(attrs,
                    R.styleable.ChangeColorIconWithText);
    
            int n = a.getIndexCount();
    
            for (int i = 0; i < n; i++) {
                int attr = a.getIndex(i);
                switch (attr) {
                    case R.styleable.ChangeColorIconWithText_icon:
                        BitmapDrawable drawable = (BitmapDrawable) a.getDrawable(attr);
                        mIconBitmap = drawable.getBitmap();
                        break;
                    case R.styleable.ChangeColorIconWithText_color:
                        mColor = a.getColor(attr, 0xFFEB6100);
                        break;
                    case R.styleable.ChangeColorIconWithText_text:
                        mText = a.getString(attr);
                        break;
                    case R.styleable.ChangeColorIconWithText_text_size:
                        mTextSize = (int) a.getDimension(attr, TypedValue
                                .applyDimension(TypedValue.COMPLEX_UNIT_SP, 12,
                                        getResources().getDisplayMetrics()));
                        break;
                }
    
            }
    
            a.recycle();
    
            mTextBound = new Rect();
            mTextPaint = new Paint();
            mTextPaint.setTextSize(mTextSize);
            mTextPaint.setColor(0Xff555555);
            mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
    
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int iconWidth = Math.min(getMeasuredWidth() - getPaddingLeft()
                    - getPaddingRight(), getMeasuredHeight() - getPaddingTop()
                    - getPaddingBottom() - mTextBound.height());
    
            int left = getMeasuredWidth() / 2 - iconWidth / 2;
            int top = getMeasuredHeight() / 2 - (mTextBound.height() + iconWidth)
                    / 2;
            mIconRect = new Rect(left, top, left + iconWidth, top + iconWidth);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawBitmap(mIconBitmap, null, mIconRect, null);
    
            int alpha = (int) Math.ceil(255 * mAlpha);
    
            // 内存去准备mBitmap , setAlpha , 纯色 ,xfermode , 图标
            setupTargetBitmap(alpha);
            // 1、绘制原文本 ; 2、绘制变色的文本
            drawSourceText(canvas, alpha);
            drawTargetText(canvas, alpha);
    
            canvas.drawBitmap(mBitmap, 0, 0, null);
    
        }
    
        /**
         * 绘制变色的文本
         *
         * @param canvas
         * @param alpha
         */
        private void drawTargetText(Canvas canvas, int alpha) {
            mTextPaint.setColor(mColor);
            mTextPaint.setAlpha(alpha);
            int x = getMeasuredWidth() / 2 - mTextBound.width() / 2;
            int y = mIconRect.bottom + mTextBound.height();
            canvas.drawText(mText, x, y, mTextPaint);
    
        }
    
        /**
         * 绘制原文本
         *
         * @param canvas
         * @param alpha
         */
        private void drawSourceText(Canvas canvas, int alpha) {
            mTextPaint.setColor(0xff333333);
            mTextPaint.setAlpha(255 - alpha);
            int x = getMeasuredWidth() / 2 - mTextBound.width() / 2;
            int y = mIconRect.bottom + mTextBound.height();
            canvas.drawText(mText, x, y, mTextPaint);
    
        }
    
        /**
         * 在内存中绘制可变色的Icon
         */
        private void setupTargetBitmap(int alpha) {
            mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
                    Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
            mPaint = new Paint();
            mPaint.setColor(mColor);
            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 static final String INSTANCE_STATUS = "instance_status";
        private static final String STATUS_ALPHA = "status_alpha";
    
        @Override
        protected Parcelable onSaveInstanceState() {
            Bundle bundle = new Bundle();
            bundle.putParcelable(INSTANCE_STATUS, super.onSaveInstanceState());
            bundle.putFloat(STATUS_ALPHA, mAlpha);
            return bundle;
        }
    
        @Override
        protected void onRestoreInstanceState(Parcelable state) {
            if (state instanceof Bundle) {
                Bundle bundle = (Bundle) state;
                mAlpha = bundle.getFloat(STATUS_ALPHA);
                super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATUS));
                return;
            }
            super.onRestoreInstanceState(state);
        }
    
        public void setIconAlpha(float alpha) {
            this.mAlpha = alpha;
            invalidateView();
        }
    
        /**
         * 重绘
         */
        private void invalidateView() {
            if (Looper.getMainLooper() == Looper.myLooper()) {
                invalidate();
            } else {
                postInvalidate();
            }
        }
    
    }
    
    
    
    

    2. 使用

     <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@drawable/tab_bg"
            android:orientation="horizontal" >
    
            <com.zss.weixin.ChangeColorIconWithText
                android:id="@+id/id_indicator_one"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:padding="5dp"
                app:icon="@drawable/ic_menu_start_conversation"
                app:text="@string/app_name"
                app:text_size="12sp"
                app:color="#ffEB6100" />
    
            <com.zss.weixin.ChangeColorIconWithText
                android:id="@+id/id_indicator_two"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:padding="5dp"
                app:icon="@drawable/ic_menu_friendslist"
                app:text="@string/tab_contact"
                app:text_size="12sp"
                app:color="#ffEB6100" />
    
            <com.zss.weixin.ChangeColorIconWithText
                android:id="@+id/id_indicator_three"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:padding="5dp"
                app:icon="@drawable/ic_menu_emoticons"
                app:text="@string/tab_found"
                app:text_size="12sp"
                app:color="#ffEB6100" />
    
            <com.zss.weixin.ChangeColorIconWithText
                android:id="@+id/id_indicator_four"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:padding="5dp"
                app:icon="@drawable/ic_menu_allfriends"
                app:text="@string/tab_me"
                app:text_size="12sp"
                app:color="#ffEB6100" />
        </LinearLayout>
    
    

    3. 逻辑

      private List<ChangeColorIconWithText> mTabIndicators = new ArrayList<ChangeColorIconWithText>();
            ChangeColorIconWithText one = (ChangeColorIconWithText) findViewById(R.id.id_indicator_one);
            mTabIndicators.add(one);
            ChangeColorIconWithText two = (ChangeColorIconWithText) findViewById(R.id.id_indicator_two);
            mTabIndicators.add(two);
            ChangeColorIconWithText three = (ChangeColorIconWithText) findViewById(R.id.id_indicator_three);
            mTabIndicators.add(three);
            ChangeColorIconWithText four = (ChangeColorIconWithText) findViewById(R.id.id_indicator_four);
            mTabIndicators.add(four);
    
            one.setOnClickListener(this);
            two.setOnClickListener(this);
            three.setOnClickListener(this);
            four.setOnClickListener(this);
    
            one.setIconAlpha(1.0f);
    
    
     /**
         * 点击Tab按钮
         *
         * @param v
         */
        private void clickTab(View v) {
            resetOtherTabs();
            switch (v.getId()) {
                case R.id.id_indicator_one:
                    mTabIndicators.get(0).setIconAlpha(1.0f);
                    mViewPager.setCurrentItem(0, false);
                    break;
                case R.id.id_indicator_two:
                    mTabIndicators.get(1).setIconAlpha(1.0f);
                    mViewPager.setCurrentItem(1, false);
                    break;
                case R.id.id_indicator_three:
                    mTabIndicators.get(2).setIconAlpha(1.0f);
                    mViewPager.setCurrentItem(2, false);
                    break;
                case R.id.id_indicator_four:
                    mTabIndicators.get(3).setIconAlpha(1.0f);
                    mViewPager.setCurrentItem(3, false);
                    break;
            }
        }
    
        /**
         * 重置其他的TabIndicator的颜色
         */
        private void resetOtherTabs() {
            for (int i = 0; i < mTabIndicators.size(); i++) {
                mTabIndicators.get(i).setIconAlpha(0);
            }
        }
    
        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            // Log.e("TAG", "position = " + position + " ,positionOffset =  "
            // + positionOffset);
            if (positionOffset > 0) {
                ChangeColorIconWithText left = mTabIndicators.get(position);
                ChangeColorIconWithText right = mTabIndicators.get(position + 1);
                left.setIconAlpha(1 - positionOffset);
                right.setIconAlpha(positionOffset);
            }
    
        }
    
    

    demo地址:https://github.com/zssAndroid/-view-6.0-

    相关文章

      网友评论

          本文标题:自定义view实现仿微信6.0底部导航颜色渐变效果

          本文链接:https://www.haomeiwen.com/subject/uqiqhxtx.html