Android 微信6.1 tab栏图标和字体颜色渐变的实现

相信大家都见到了微信图标颜色渐变的过程,是不是感觉很牛逼?不得不说微信团队确实是很厉害的团队,不管是从设计还是开发人员。

今天我带大家来看看,微信 tab 栏图标和字体颜色渐变的过程。先上图吧!今天学了一招制作 gif 动态图的快捷方法。刚好用的上,以前一直想写点什么东西,

苦于一直不知道怎么生成动态图,现在终于学会了,哈哈,让我偷偷的乐一会。额,还是上图吧。。。

好了,效果图也看到了,那么我也就不多啰嗦了,直接进入主题,看代码

[java] view plain copy
package moon.wechat.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
/**
 * Created by moon.zhong on 2015/2/4.
 */
public class TabItem extends View {
  /*字体大小*/
  private int mTextSize ;
  /*字体选中的颜色*/
  private int mTextColorSelect ;
  /*字体未选择的时候的颜色*/
  private int mTextColorNormal;
  /*绘制未选中时字体的画笔*/
  private Paint mTextPaintNormal;
  /*绘制已选中时字体的画笔*/
  private Paint mTextPaintSelect;
  /*每个 item 的宽和高,包括字体和图标一起*/
  private int mViewHeight, mViewWidth;
  /*字体的内容*/
  private String mTextValue ;
  /*已选中时的图标*/
  private Bitmap mIconNormal;
  /*未选中时的图标*/
  private Bitmap mIconSelect;
  /*用于记录字体大小*/
  private Rect mBoundText;
  /*已选中是图标的画笔*/
  private Paint mIconPaintSelect;
  /*为选中时图标的画笔*/
  private Paint mIconPaintNormal;
  public TabItem(Context context) {
    this(context, null);
  }
  public TabItem(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public TabItem(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView();
    initText();
  }
  /*初始化一些东西*/
  private void initView() {
    mBoundText = new Rect();
  }
  /*初始化画笔,并设置出是内容*/
  private void initText() {
    mTextPaintNormal = new Paint();
    mTextPaintNormal.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, mTextSize, getResources().getDisplayMetrics()));
    mTextPaintNormal.setColor(mTextColorNormal);
    mTextPaintNormal.setAntiAlias(true);
    mTextPaintNormal.setAlpha(0xff);
    mTextPaintSelect = new Paint();
    mTextPaintSelect.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, mTextSize, getResources().getDisplayMetrics()));
    mTextPaintSelect.setColor(mTextColorSelect);
    mTextPaintSelect.setAntiAlias(true);
    mTextPaintSelect.setAlpha(0);
    mIconPaintSelect = new Paint(Paint.ANTI_ALIAS_FLAG) ;
    mIconPaintSelect.setAlpha(0);
    mIconPaintNormal = new Paint(Paint.ANTI_ALIAS_FLAG) ;
    mIconPaintNormal.setAlpha(0xff);
  }
  /*测量字体的大小*/
  private void measureText() {
    mTextPaintNormal.getTextBounds(mTextValue, 0, mTextValue.length(), mBoundText);
  }
  /*测量字体和图标的大小,并设置自身的宽和高*/
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    int width = 0, height = 0;
    measureText();
    int contentWidth = Math.max(mBoundText.width(), mIconNormal.getWidth());
    int desiredWidth = getPaddingLeft() + getPaddingRight() + contentWidth;
    switch (widthMode) {
      case MeasureSpec.AT_MOST:
        width = Math.min(widthSize, desiredWidth);
        break;
      case MeasureSpec.EXACTLY:
        width = widthSize;
        break;
      case MeasureSpec.UNSPECIFIED:
        width = desiredWidth;
        break;
    }
    int contentHeight = mBoundText.height() + mIconNormal.getHeight();
    int desiredHeight = getPaddingTop() + getPaddingBottom() + contentHeight;
    switch (heightMode) {
      case MeasureSpec.AT_MOST:
        height = Math.min(heightSize, desiredHeight);
        break;
      case MeasureSpec.EXACTLY:
        height = heightSize;
        break;
      case MeasureSpec.UNSPECIFIED:
        height = contentHeight;
        break;
    }
    setMeasuredDimension(width, height);
    mViewWidth = getMeasuredWidth() ;
    mViewHeight = getMeasuredHeight() ;
  }
  @Override
  protected void onDraw(Canvas canvas) {
    drawBitmap(canvas) ;
    drawText(canvas) ;
  }
  /*话图标,先画为选中的图标,在画已选中的图标*/
  private void drawBitmap(Canvas canvas) {
    int left = (mViewWidth - mIconNormal.getWidth())/2 ;
    int top = (mViewHeight - mIconNormal.getHeight() - mBoundText.height()) /2 ;
    canvas.drawBitmap(mIconNormal, left, top ,mIconPaintNormal);
    canvas.drawBitmap(mIconSelect, left, top , mIconPaintSelect);
  }
  /*画字体*/
  private void drawText(Canvas canvas) {
    float x = (mViewWidth - mBoundText.width())/2.0f ;
    float y = (mViewHeight + mIconNormal.getHeight() + mBoundText.height()) /2.0F ;
    canvas.drawText(mTextValue,x,y, mTextPaintNormal);
    canvas.drawText(mTextValue,x,y, mTextPaintSelect);
  }
  public void setTextSize(int textSize) {
    this.mTextSize = textSize;
    mTextPaintNormal.setTextSize(textSize);
    mTextPaintSelect.setTextSize(textSize);
  }
  public void setTextColorSelect(int mTextColorSelect) {
    this.mTextColorSelect = mTextColorSelect;
    mTextPaintSelect.setColor(mTextColorSelect);
    mTextPaintSelect.setAlpha(0);
  }
  public void setTextColorNormal(int mTextColorNormal) {
    this.mTextColorNormal = mTextColorNormal;
    mTextPaintNormal.setColor(mTextColorNormal);
    mTextPaintNormal.setAlpha(0xff);
  }
  public void setTextValue(String TextValue) {
    this.mTextValue = TextValue;
  }
  public void setIconText(int[] iconSelId,String TextValue) {
    this.mIconSelect = BitmapFactory.decodeResource(getResources(), iconSelId[0]);
    this.mIconNormal = BitmapFactory.decodeResource(getResources(), iconSelId[1]);
    this.mTextValue = TextValue;
  }
  /*通过 alpha 来设置 每个画笔的透明度,从而实现现实的效果*/
  public void setTabAlpha(float alpha){
    int paintAlpha = (int)(alpha*255) ;
    mIconPaintSelect.setAlpha(paintAlpha);
    mIconPaintNormal.setAlpha(255-paintAlpha);
    mTextPaintSelect.setAlpha(paintAlpha);
    mTextPaintNormal.setAlpha(255-paintAlpha);
    invalidate();
  }
}

分析: 以上代码,功能实现 tab 的每个 item 的内容,在微信的项目中也就是,一个图标加一个字体,

关键代码就在public void setTabAlpha(float alpha) 这个方法,此方法是 viewPager 切换 item 时,不断改变偏移量来调用,从而不断改变

每个画笔的透明度,实现图标和颜色的渐变;是不是很简单?到这里其实我们颜色渐变的代码就已经实现了。接下来的内容可以忽略

这样我们只需要在 MainActivity 的 xml 中定义一个线性布局,然后放如四个我们自定义的 View 进去,就可以了。但是这样你就满足了吗?

我先来给你们看看我的MainActivity的代码;

[java] view plain copy
package moon.wechat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import java.util.HashMap;
import java.util.Map;
import moon.wechat.view.TabView;
public class MainActivity extends ActionBarActivity {
  private String[] mTitle = {"微信", "通讯录", "发现", "我"};
  private int[] mIconSelect = {R.drawable.al_, R.drawable.al8, R.drawable.alb, R.drawable.ald};
  private int[] mIconNormal = {R.drawable.ala, R.drawable.al9, R.drawable.alc, R.drawable.ale};
  private ViewPager mViewPager ;
  private TabView mTabView ;
  private Map<Integer,Fragment> mFragmentMap ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mFragmentMap = new HashMap<>() ;
    mViewPager = (ViewPager)findViewById(R.id.id_view_pager) ;
    mViewPager.setOffscreenPageLimit(4);
    mViewPager.setAdapter(new PageAdapter(getSupportFragmentManager()));
    mTabView = (TabView)findViewById(R.id.id_tab) ;
    mTabView.setViewPager(mViewPager);
  }
  private Fragment getFragment(int position){
    Fragment fragment = mFragmentMap.get(position) ;
    if(fragment == null){
      switch (position){
        case 0:
          fragment = new WeChatFragment() ;
          break ;
        case 1:
          fragment = new WeContactFragment();
          break ;
        case 2:
          fragment = new WeDiscoverFragment();
          break;
        case 3:
          fragment = new GameFragment() ;
//          fragment = new WeMineFragment();
          break;
      }
      mFragmentMap.put(position,fragment) ;
    }
    return fragment ;
  }
  class PageAdapter extends FragmentPagerAdapter implements TabView.OnItemIconTextSelectListener{
    public PageAdapter(FragmentManager fm) {
      super(fm);
    }
    @Override
    public Fragment getItem(int position) {
      return getFragment(position);
    }
    @Override
    public int[] onIconSelect(int position) {
      int icon[] = new int[2] ;
      icon[0] = mIconSelect[position] ;
      icon[1] = mIconNormal[position] ;
      return icon;
    }
    @Override
    public String onTextSelect(int position) {
      return mTitle[position];
    }
    @Override
    public int getCount() {
      return mTitle.length;
    }
  }
}

是不是很简单,而 xml 更简单

[html] view plain copy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:zgy="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/white"
  android:orientation="vertical">
  <android.support.v4.view.ViewPager
    android:id="@+id/id_view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    >
    </android.support.v4.view.ViewPager>
  <moon.wechat.view.TabView
    android:id="@+id/id_tab"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#eeeeee"
    zgy:text_size="12sp"
    zgy:text_normal_color="#ff777777"
    zgy:text_select_color="#ff45c01a"
    zgy:item_padding="7dp">
   </moon.wechat.view.TabView>
</LinearLayout>

可以看到没有定义我们刚刚自定义的 TabItem,而是使用的 TabView,那 TabView 到底是啥东西?相信大家都想到了,TabView 其实就是我们自定义的线性布局,

[java] view plain copy
package moon.wechat.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
import moon.wechat.R;
/**
 * Created by moon.zhong on 2015/2/4.
 */
public class TabView extends LinearLayout implements View.OnClickListener {
  private ViewPager mViewPager;
  private ViewPager.OnPageChangeListener mOnPageChangeListener;
  private PagerAdapter mPagerAdapter;
  private int mChildSize;
  private List<TabItem> mTabItems;
  private OnItemIconTextSelectListener mListener;
  private int mTextSize = 12;
  private int mTextColorSelect = 0xff45c01a;
  private int mTextColorNormal = 0xff777777;
  private int mPadding = 10;
  public TabView(Context context) {
    this(context, null);
  }
  public TabView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public TabView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray typedArray = getResources().obtainAttributes(attrs, R.styleable.TabView);
    int N = typedArray.getIndexCount();
    for (int i = 0; i < N; i++) {
      switch (typedArray.getIndex(i)) {
        case R.styleable.TabView_text_size:
          mTextSize = (int) typedArray.getDimension(i, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
              mTextSize, getResources().getDisplayMetrics()));
          break;
        case R.styleable.TabView_text_normal_color:
          mTextColorNormal = typedArray.getColor(i, mTextColorNormal);
          break;
        case R.styleable.TabView_text_select_color:
          mTextColorSelect = typedArray.getColor(i, mTextColorSelect);
          break;
        case R.styleable.TabView_item_padding:
          mPadding = (int) typedArray.getDimension(i, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
              mPadding, getResources().getDisplayMetrics()));
          break;
      }
    }
    typedArray.recycle();
    mTabItems = new ArrayList<>();
  }
  public void setViewPager(final ViewPager mViewPager) {
    if (mViewPager == null) {
      return;
    }
    this.mViewPager = mViewPager;
    this.mPagerAdapter = mViewPager.getAdapter();
    if (this.mPagerAdapter == null) {
      throw new RuntimeException("亲,在您设置TabView的ViewPager时,请先设置ViewPager的PagerAdapter");
    }
    this.mChildSize = this.mPagerAdapter.getCount();
    this.mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//        Log.v("zgy","=============position="+position+",====positionOffset="+positionOffset) ;
        View leftView;
        View rightView;
        if (positionOffset > 0) {
          leftView = mViewPager.getChildAt(position);
          rightView = mViewPager.getChildAt(position + 1);
          leftView.setAlpha(1 - positionOffset);
          rightView.setAlpha(positionOffset);
          mTabItems.get(position).setTabAlpha(1 - positionOffset);
          mTabItems.get(position + 1).setTabAlpha(positionOffset);
        } else {
          mViewPager.getChildAt(position).setAlpha(1);
          mTabItems.get(position).setTabAlpha(1 - positionOffset);
        }
        if (mOnPageChangeListener != null) {
mOnPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
        }
      }
      @Override
      public void onPageSelected(int position) {
        if (mOnPageChangeListener != null) {
mOnPageChangeListener.onPageSelected(position);
        }
      }
      @Override
      public void onPageScrollStateChanged(int state) {
        if (mOnPageChangeListener != null) {
mOnPageChangeListener.onPageScrollStateChanged(state);
        }
      }
    });
    if (mPagerAdapter instanceof OnItemIconTextSelectListener) {
      mListener = (OnItemIconTextSelectListener) mPagerAdapter;
    }else {
      throw new RuntimeException("请让你的pageAdapter实现OnItemIconTextSelectListener接口");
    }
    initItem();
  }
  public void setOnPageChangeListener(ViewPager.OnPageChangeListener mOnPageChangeListener) {
    this.mOnPageChangeListener = mOnPageChangeListener;
  }
  private void initItem() {
    for (int i = 0; i < mChildSize; i++) {
      TabItem tabItem = new TabItem(getContext());
      LayoutParams params = new LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
      tabItem.setPadding(mPadding, mPadding, mPadding, mPadding);
      tabItem.setIconText(mListener.onIconSelect(i), mListener.onTextSelect(i));
      tabItem.setTextSize(mTextSize);
      tabItem.setTextColorNormal(mTextColorNormal);
      tabItem.setTextColorSelect(mTextColorSelect);
      tabItem.setLayoutParams(params);
      tabItem.setTag(i);
      tabItem.setOnClickListener(this);
      mTabItems.add(tabItem);
      addView(tabItem);
    }
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  }
  @Override
  public void onClick(View v) {
    int position = (Integer) v.getTag();
    if (mViewPager.getCurrentItem() == position) {
      return;
    }
    for (TabItem tabItem : mTabItems) {
      tabItem.setTabAlpha(0);
    }
    mTabItems.get(position).setTabAlpha(1);
    mViewPager.setCurrentItem(position, false);
  }
  public interface OnItemIconTextSelectListener {
    int[] onIconSelect(int position);
    String onTextSelect(int position);
  }
}

注释有点少,额,不是少,是压根就没有,其实,这个类的代码不需要注释,我相信大家都能看懂,我就讲下他的作用吧,

  1. 添加 item
  2. 监听 ViewPager 的滚动事件,从而设置相应 item 之间的颜色渐变,
  3. 设置相应 ViewPage 的透明度
  4. 为 TabItem 设置监听事件,

其实上面很多功能本来是在 MainActivity 中实现的,为了减少 Activity 内部的代码量,抽取出来,到达低耦合,高内聚的效果。

Ok,以上就是 微信6.1 tab 栏颜色渐变效果的实现全过程。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • Android 改变图标原有颜色和搜索框的实例代码

    图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了. 搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居中,键盘搜索. 来看看效果图: 图标改变颜色:第一个界面的左边(二维码)和右边(更多)两个实现,我放进去的图片是黑色的,显示出来是白色的. 搜索框:第一个界面的图片和文字居中,还可以设置间距,第二个见面搜索设置键盘搜索按钮,点击搜索监听事件,清除内容的图标.

  • Android 根据EditText搜索框ListView动态显示数据

    根据EditText搜索框ListView动态显示数据是根据需求来的,觉得这之中涉及的东西可能比较的有意思,所以动手来写一写,希望对大家有点帮助. 首先,我们来分析下整个过程: 1.建立一个layout,包含一个EditText搜索框和一个ListView 2.创建一个数据集mData,用于ListView的Adapter的创建 3.添加EditText的文本改变的监听器 4.利用notifyDataSetChanged()动态更新ListView 第一步:创建一个搜索框 这个还是比较容易的,这

  • Android搜索框通用版

    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏. 先看下效果图: 没什么特别的,只是今天要做的就是简单的把搜索框的内容封装一下. 一.分析功能 先考虑一下,搜索框一般都是由一个搜索图标(一般都是一个放大镜),一个输入框和一个清除按钮组成.然后会通过监听输入框的变化去处理清除按钮的显示和隐藏并且去过滤相关的数据.最后去刷新适配器,显示过滤后的数据.基本上搜索框的功能都大同小异. 有了上边的分

  • Android SearchView搜索框组件的使用方法

    SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索. 本文就为大家分享了SearchView搜索框组件的使用方法,供大家参考,具体内容如下 效果: 代码SearchActivity.java package com.jialianjia.bzw.activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.

  • Android搜索框组件SearchView的基本使用方法

    SearchView是android系统中内置的一个搜索框组件,可以很方便在添加在用户界面之上,但是也带来了一些问题,那就是searchview的UI是固定的,定制起来会很麻烦,如果对SearchView的要求比较高,完全可以采用button和EditText自己实现.这里先简单的说说SearchView的使用: main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" x

  • Android 微信6.1 tab栏图标和字体颜色渐变的实现

    相信大家都见到了微信图标颜色渐变的过程,是不是感觉很牛逼?不得不说微信团队确实是很厉害的团队,不管是从设计还是开发人员. 今天我带大家来看看,微信 tab 栏图标和字体颜色渐变的过程.先上图吧!今天学了一招制作 gif 动态图的快捷方法.刚好用的上,以前一直想写点什么东西, 苦于一直不知道怎么生成动态图,现在终于学会了,哈哈,让我偷偷的乐一会.额,还是上图吧... 好了,效果图也看到了,那么我也就不多啰嗦了,直接进入主题,看代码 [java] view plain copy package mo

  • Android修改DatePicker字体颜色及分割线颜色详细介绍

    一.DatePicker和TimePicker简介 DatePicker是一个日期选择控件,它继承自FrameLayout类,用来实现的主要功能是使用护可以方便选择日期.如果要捕获用户修改DataPicker控件中的数据改变事件,需要为DatePicker添加OnDateChangedListener监听器. TimePicker是一个时间选择控件,也继承自FrameLayout类.时间选择控件向用户显示一天中的时间(可以为24小时,也可以为AM/PM制),并允许用户进行选择.如果要捕获用户修改

  • Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager; 3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮; 代码实现: 1. 新建第一个自定义View, 图标 + 文字 的底部按钮; /** * 自定义控件

  • Android实现App中导航Tab栏悬浮的功能

    首先是"饿了么"导航Tab栏悬浮的效果图. 大家可以看到上图中的"分类"."排序"."筛选"会悬浮在app的顶部,状态随着ScrollView(也可能不是ScrollView,在这里姑且把这滑动的UI控件当作ScrollView吧)的滚动而变化.像这种导航Tab栏悬浮的作用相信大家都能体会到,Tab栏不会随着ScrollView等的滚动而被滑出屏幕外,增加了与用户之间的交互性和方便性. 看到上面的效果,相信大家都跃跃欲试了,那

  • 使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换操作</title> <link rel="stylesheet"

  • 微信小程序tab切换可滑动切换导航栏跟随滚动实现代码

    简介 看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能 像商城类商品类目如果做成左右滑动切换类目用户体验应该会好很多,我这里只是一个小demo,没有怎么去考虑数据的问题,主要是想着去实现这么个功能,有可能后期引入数据后会出现问题,欢迎提出互相讨论 解决过程 1.在想要实现这个问题的时候找了不少别人的博客看,主体页面布局方面是比较统一的,tab导航栏使用<scroll-view>标签,内容使用<swi

  • 微信小程序页面向下滚动时tab栏固定页面顶部实例讲解

    先看一下效果图: index.wxml <view class='{{tabIsTop ? "fixedTop" : ""}}'> <i-tabs tabcurrent="{{tabcurrent}}" color="#FF0000" bindchange="tabChange"> <i-tab key="tab1" title="车主圈"

  • Android TabLayout 实现底部Tab的示例代码

    前言 底部Tab已经是一个应用的标配了,因为手机屏幕大小的限制,使得我们必须去最大化的利用可见的空间.当然底部Tab一般为3个左右,最多不会超过5个. 效果图 下面是我使用TabLayout来实现的底部Tab, 实现方式也很简单,因为这里没有"小滑块".只需要去处理,Tab的滑动和点击即可. 代码: public class CustomBotTabItem { private TabLayout mTabLayout; private ViewPager mViewPager; pr

  • Android如何动态改变App桌面图标

    时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一,元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式(更多文章请关注我的微信公众账号,左边二维码). 我们知道,我们每写一个 Activity就要在AndroidManifest进行配置一下,我们才可以正常的启动它,除此之外,我们还可以对它设置一个别

  • Android微信抢红包功能的实现原理浅析

    快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的APP.现在就一步一步来实现它. 实现思路 微信抢红包程序开启时候,他就可以随时识别.捕获红包,服务可以实现正在功能,当我们开启服务的时候,服务就不停的在后台运行,不停地轮询着微信里面的消息,当发现红包时候就立即打开微信红包所在的界面.但是他怎识别红包呢?需要找到微信抢红包里面节点的view,当找到对应的view,在获取view的关键字或者id,根据关键字或者id,自动的模

随机推荐