全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android仿微信底部按钮滑动变色

Android仿微信底部按钮滑动变色,这里只针对使用Fragment为Tab页的滑动操作,进行简单的变色讲解。

首先说下OnPageChangeListener这个监听

//这个监听有三个方法
public abstract void onPageScrollStateChanged (int state) 

public abstract void onPageScrolled (int position, float positionOffset, int positionOffsetPixels) 

public abstract void onPageSelected (int position) 

//第一个方法onPageScrollStateChanged 中的参数state,有三个可取的值

public static final int SCROLL_STATE_DRAGGING 
Constant Value: 1 (0x00000001) //手指按在ViewPager上滑动时

public static final int SCROLL_STATE_IDLE 
Constant Value: 0 (0x00000000) //手指松开后,ViewPager自动滑动期间

public static final int SCROLL_STATE_SETTLING 
Constant Value: 2 (0x00000002) //ViewPager进入了某个Page

//如果在onPageScrollStateChanged 中输出state的值,你会发现每次都是按顺序打印出“1---2---0”

//第二个方法onPageScrolled的三个参数

position://滑动时,屏幕左侧显示的第一个page

positionOffset://滑动比例,值的范围为[0, 1),手指往左滑动,该值递增,反之递减

positionOffsetPixels://滑动距离,和屏幕有关,手指往左滑动,该值递增,反之递减

//我们经常需要检查viewpager的滑动方向并作出一些操作,这时你只需要通过position和positionOffset两个值即可实现该功能。

//比如实现微信底部图标颜色渐变 向左滑动时

ChangeColorIconWithTextView left = mTabIndicator.get(position); //左侧显示的第一个page页面上底部图标和文字的初始化
ChangeColorIconWithTextView right = mTabIndicator.get(position + 1); //右侧显示的Page底部图标和文字的初始化

left.setIconAlpha(1 - positionOffset); //设置图标的透明度 此时positionOffset值递增 左侧图标的颜色变浅
right.setIconAlpha(positionOffset); //右侧图标的颜色逐渐变深

//第三个方法onPageSelected的三个参数

position://当前选择的page序号

//该方法被调用的时间比较特别,在上面的第一个方法中的“1---2----0”中的2执行之后,onPageSelected就执行,然后执行“1---2----0”中的0。就是手指松开屏幕之后,onPageSelected被执行。

上面提到了ChangeColorIconWithTextView 主要类

package com.mhealth.nursestation.app.pda.business.login.base.ui.fragmentutil;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
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;

import com.mhealth.nursestation.app.pda.R;


/**
 * 此类用于修改颜色渐变
 */
public class ChangeColorIconWithTextView extends View {

  private Bitmap mBitmap;
  private Canvas mCanvas;
  private Paint mPaint;
  /**
   * 颜色
   */
  private int mColor = 0XFF07B7C4;
  /**
   * 透明度 0.0-1.0 初始化必须是0 不是0就废了
   */
  private float mAlpha = 0f;
  /**
   * 图标
   */
  private Bitmap mIconBitmap;
  /**
   * 限制绘制icon的范围
   */
  private Rect mIconRect;
  /**
   * icon底部文本
   */
  private String mText = "微信";
  private int mTextSize = (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics());
  private Paint mTextPaint;
  private Rect mTextBound = new Rect();

  public ChangeColorIconWithTextView(Context context) {
    super(context);
  }

  /**
   * 初始化自定义属性值
   * 
   * @param context
   * @param attrs
   */
  public ChangeColorIconWithTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    // 获取设置的图标
    TypedArray a = context.obtainStyledAttributes(attrs,
        R.styleable.ChangeColorIconView);

    int n = a.getIndexCount();
    for (int i = 0; i < n; i++) {

      int attr = a.getIndex(i);
      switch (attr) {
      case R.styleable.ChangeColorIconView_icon:
        BitmapDrawable drawable = (BitmapDrawable) a.getDrawable(attr);
        mIconBitmap = drawable.getBitmap();
        break;
      case R.styleable.ChangeColorIconView_color:
        mColor = a.getColor(attr, 0x07B7C4);
        break;
      case R.styleable.ChangeColorIconView_text:
        mText = a.getString(attr);
        break;
      case R.styleable.ChangeColorIconView_text_size:
        mTextSize = (int) a.getDimension(attr, TypedValue
            .applyDimension(TypedValue.COMPLEX_UNIT_SP, 10,
                getResources().getDisplayMetrics()));
        break;

      }
    }

    a.recycle();

    mTextPaint = new Paint();
    mTextPaint.setTextSize(mTextSize);
    mTextPaint.setColor(0xff07B7C4);
    mTextPaint.setAntiAlias(true); 
    // 得到text绘制范围
    mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBound);

  }

  @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);

  }

  @Override
  protected void onDraw(Canvas canvas) {

    int alpha = (int) Math.ceil((255 * mAlpha));
    canvas.drawBitmap(mIconBitmap, null, mIconRect, null);
    setupTargetBitmap(alpha);
    drawSourceText(canvas, alpha);
    drawTargetText(canvas, alpha);
    canvas.drawBitmap(mBitmap, 0, 0, null);

  }

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

  /**
   * 透明度 255
   * 
   * @param canvas
   * @param alpha
   */
  private void drawSourceText(Canvas canvas, int alpha) {
    mTextPaint.setTextSize(mTextSize);
    mTextPaint.setColor(0x00333333);
    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(mColor);
    mTextPaint.setAlpha(alpha);
    canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2
        - mTextBound.width() / 2,
        mIconRect.bottom + mTextBound.height(), mTextPaint);

  }

  public void setIconAlpha(float alpha) {
    this.mAlpha = alpha;
    invalidateView();
  }

  private void invalidateView() {
    if (Looper.getMainLooper() == Looper.myLooper()) {
      invalidate();
    } else {
      postInvalidate();
    }
  }

  public void setIconColor(int color) {
    mColor = color;
  }

  public void setIcon(int resId) {
    this.mIconBitmap = BitmapFactory.decodeResource(getResources(), resId);
    if (mIconRect != null)
      invalidateView();
  }

  public void setIcon(Bitmap iconBitmap) {
    this.mIconBitmap = iconBitmap;
    if (mIconRect != null)
      invalidateView();
  }

  private static final String INSTANCE_STATE = "instance_state";
  private static final String STATE_ALPHA = "state_alpha";

  @Override
  protected Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    bundle.putParcelable(INSTANCE_STATE, super.onSaveInstanceState());
    bundle.putFloat(STATE_ALPHA, mAlpha);
    return bundle;
  }

  @Override
  protected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) {
      Bundle bundle = (Bundle) state;
      mAlpha = bundle.getFloat(STATE_ALPHA);
      super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATE));
    } else {
      super.onRestoreInstanceState(state);
    }
  }
}

在Activity里面实现监听操作

@Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    if (positionOffset > 0) {
      ChangeColorIconWithTextView left = mTabIndicator.get(position);
      ChangeColorIconWithTextView right = mTabIndicator.get(position + 1);

      left.setIconAlpha(1 - positionOffset);
      right.setIconAlpha(positionOffset);
    }
  }

定义一个集合,将所有变色控件装载进去

private List<ChangeColorIconWithTextView> mTabIndicator = new ArrayList<ChangeColorIconWithTextView>();

private void initTabIndicator() {
    ChangeColorIconWithTextView one = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_one);
    ChangeColorIconWithTextView two = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_two);
    ChangeColorIconWithTextView three = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_three);
    ChangeColorIconWithTextView four = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_four);

    mTabIndicator.add(one);
    mTabIndicator.add(two);
    mTabIndicator.add(three);
    mTabIndicator.add(four);

    one.setOnClickListener(this);
    two.setOnClickListener(this);
    three.setOnClickListener(this);
    four.setOnClickListener(this);

    one.setIconAlpha(1.0f);
  }

点击监听

@Override
  public void onClick(View v) {

    resetOtherTabs();

    switch (v.getId()) {
    case R.id.id_indicator_one:
      mTabIndicator.get(0).setIconAlpha(1.0f);
      mViewPager.setCurrentItem(0, false);
      break;
    case R.id.id_indicator_two:
      mTabIndicator.get(1).setIconAlpha(1.0f);
      mViewPager.setCurrentItem(1, false);
      break;
    case R.id.id_indicator_three:
      mTabIndicator.get(2).setIconAlpha(1.0f);
      mViewPager.setCurrentItem(2, false);
      mAppContext.has_new_talk = false;

      break;
    case R.id.id_indicator_four:
      mTabIndicator.get(3).setIconAlpha(1.0f);
      mViewPager.setCurrentItem(3, false);
      break;

    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 微信  # 滑动变色  # Android自定义Seekbar滑动条 Pop提示跟随滑动按钮滑动  # Android编程之滑动按钮事件实例详解  # Android编程实现滑动按钮功能详解  # 自定义滑动按钮为例图文剖析Android自定义View绘制  # 如何在Android中实现渐显按钮的左右滑动效果  # Android自定义实现可滑动按钮  # 第一个  # 都是  # 往左  # 第二个  # 此类  # 自定义  # 在上面  # 第三个  # 你会发现  # 大家多多  # 废了  # 你只需要  # 变浅  # os  # Bundle  # super  # param  # context  # AttributeSet  # mTextBound 


相关文章: 建站之星伪静态规则如何设置?  如何通过cPanel快速搭建网站?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何在景安服务器上快速搭建个人网站?  如何快速搭建安全的FTP站点?  建站之星北京办公室:智能建站系统与小程序生成方案解析  太平洋网站制作公司,网络用语太平洋是什么意思?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何选择高效响应式自助建站源码系统?  独立制作一个网站多少钱,建立网站需要花多少钱?  linux top下的 minerd 木马清除方法  建站主机SSH密钥生成步骤及常见问题解答?  企业微网站怎么做,公司网站和公众号有什么区别?  C++如何编写函数模板?(泛型编程入门)  如何用美橙互联一键搭建多站合一网站?  如何用低价快速搭建高质量网站?  个人网站制作流程图片大全,个人网站如何注销?  婚礼视频制作网站,学习*后期制作的网站有哪些?  宝塔建站后网页无法访问如何解决?  建站之星如何快速更换网站模板?  定制建站流程步骤详解:一站式方案设计与开发指南  如何快速搭建FTP站点实现文件共享?  ,制作一个手机app网站要多少钱?  建站主机选购指南与交易推荐:核心配置解析  制作网站公司那家好,网络公司是做什么的?  北京网站制作的公司有哪些,北京白云观官方网站?  如何撰写建站申请书?关键要点有哪些?  红河网站制作公司,红河事业单位身份证如何上传?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  清除minerd进程的简单方法  建站之家VIP精选网站模板与SEO优化教程整合指南  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星价格显示格式升级,你的预算足够吗?  音响网站制作视频教程,隆霸音响官方网站?  如何获取上海专业网站定制建站电话?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何在IIS中新建站点并配置端口与物理路径?  如何通过远程VPS快速搭建个人网站?  建站之星各版本价格是多少?  深圳网站制作的公司有哪些,dido官方网站?  如何在IIS中新建站点并解决端口绑定冲突?  制作公司内部网站有哪些,内网如何建网站?  如何在云服务器上快速搭建个人网站?  制作网站的模板软件,网站怎么建设?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在建站宝盒中设置产品搜索功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。