亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android仿微信底部按鈕滑動變色

 更新時間:2017年03月28日 15:18:19   作者:penguinfool  
這篇文章主要介紹了Android仿微信底部按鈕滑動變色,使用Fragment為Tab頁的滑動操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Android仿微信底部按鈕滑動變色,這里只針對使用Fragment為Tab頁的滑動操作,進行簡單的變色講解。

首先說下OnPageChangeListener這個監(jiān)聽

//這個監(jiān)聽有三個方法
public abstract void onPageScrollStateChanged (int state) 

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

public abstract void onPageSelected (int position) 

//第一個方法onPageScrollStateChanged 中的參數(shù)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的值,你會發(fā)現(xiàn)每次都是按順序打印出“1---2---0”

//第二個方法onPageScrolled的三個參數(shù)

position://滑動時,屏幕左側(cè)顯示的第一個page

positionOffset://滑動比例,值的范圍為[0, 1),手指往左滑動,該值遞增,反之遞減

positionOffsetPixels://滑動距離,和屏幕有關(guān),手指往左滑動,該值遞增,反之遞減

//我們經(jīng)常需要檢查viewpager的滑動方向并作出一些操作,這時你只需要通過position和positionOffset兩個值即可實現(xiàn)該功能。

//比如實現(xiàn)微信底部圖標顏色漸變 向左滑動時

ChangeColorIconWithTextView left = mTabIndicator.get(position); //左側(cè)顯示的第一個page頁面上底部圖標和文字的初始化
ChangeColorIconWithTextView right = mTabIndicator.get(position + 1); //右側(cè)顯示的Page底部圖標和文字的初始化

left.setIconAlpha(1 - positionOffset); //設(shè)置圖標的透明度 此時positionOffset值遞增 左側(cè)圖標的顏色變淺
right.setIconAlpha(positionOffset); //右側(cè)圖標的顏色逐漸變深

//第三個方法onPageSelected的三個參數(shù)

position://當前選擇的page序號

//該方法被調(diào)用的時間比較特別,在上面的第一個方法中的“1---2----0”中的2執(zhí)行之后,onPageSelected就執(zhí)行,然后執(zhí)行“1---2----0”中的0。就是手指松開屏幕之后,onPageSelected被執(zhí)行。

上面提到了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);

    // 獲取設(shè)置的圖標
    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里面實現(xiàn)監(jiān)聽操作

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

點擊監(jiān)聽

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

    }
  }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android RollPagerView實現(xiàn)輪播圖

    Android RollPagerView實現(xiàn)輪播圖

    這篇文章主要介紹了Android RollPagerView實現(xiàn)輪播圖的相關(guān)資料,這里提供實例來實現(xiàn)輪播圖的簡單實例,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • Android圖片緩存之Bitmap詳解(一)

    Android圖片緩存之Bitmap詳解(一)

    這篇文章主要為大家詳細介紹了Android圖片緩存之Bitmap,點學(xué)習(xí)一下Bitmap、BitmapFactory這兩個類,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android使用Handler實現(xiàn)打地鼠游戲

    Android使用Handler實現(xiàn)打地鼠游戲

    這篇文章主要為大家詳細介紹了Android使用Handler實現(xiàn)打地鼠游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android自定義ViewGroup(側(cè)滑菜單)詳解及簡單實例

    Android自定義ViewGroup(側(cè)滑菜單)詳解及簡單實例

    這篇文章主要介紹了Android自定義ViewGroup(側(cè)滑菜單)詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Android App使用RecyclerView實現(xiàn)上拉和下拉刷新的方法

    Android App使用RecyclerView實現(xiàn)上拉和下拉刷新的方法

    RecyclerView一經(jīng)推出便被認為是替代ListView的存在,那么ListView的上拉和下拉刷新我們同樣可以使用RecyclerView來做到,這里我們就來看一下Android App使用RecyclerView實現(xiàn)上拉和下拉刷新的方法,首先先來點RecyclerView的小介紹:
    2016-06-06
  • Android實現(xiàn)繪制LocationMarkerView圖的示例代碼

    Android實現(xiàn)繪制LocationMarkerView圖的示例代碼

    LocationMarker是運動軌跡上Start、End, 以及整公里點上筆者自定義繪制的一個MarkerView。這篇文章主要介紹了Android實現(xiàn)繪制LocationMarkerView圖的示例代碼,希望對大家有所幫助
    2023-02-02
  • Android 圖片顯示與屏幕適配的問題

    Android 圖片顯示與屏幕適配的問題

    這篇文章主要介紹了Android 圖片顯示與屏幕適配的問題的相關(guān)資料,Android的分辨率問題是每個Android 開發(fā)者頭疼的問題,那么這里給大家介紹個萬能辦法,需要的朋友可以參考下
    2017-08-08
  • Android 自定義view實現(xiàn)水波紋動畫效果

    Android 自定義view實現(xiàn)水波紋動畫效果

    這篇文章主要介紹了 Android 自定義view實現(xiàn)水波紋動畫效果的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-01-01
  • Android中js和原生交互的示例代碼

    Android中js和原生交互的示例代碼

    本篇文章主要介紹了Android中js和原生交互的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android自定義View之酷炫圓環(huán)(二)

    Android自定義View之酷炫圓環(huán)(二)

    這篇文章主要介紹了Android自定義View之酷炫圓環(huán),本文是第二篇針對Android圓環(huán)實現(xiàn)方法進行的詳細闡述,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評論