android开发之高仿微信6.0+滑动Tab逐渐变色

一 自定义WeiXinTabChangeView

            1 自定义属性attrs.xml:

   <?xml version="1.0" encoding="utf-8"?>

  <resources>

<declare-styleable name="WinXinTabView">

<!-- 是否选中-->

<attr name="tabChecked" format="boolean" />

<!-- tab的标题-->

<attr name="tabTitle" format="string" />

<!-- 标题的大小-->

<attr name="tabTitleSize" format="dimension">

<!-- 标题的颜色-->

<attr name="tabTitleColor" format="color" />

<!-- tab的图片-->

<attr name="tabIcon" format="reference" />

<!-- 未选中时的图片-->

<attr name="tabIconOver" format="reference" />

</declare-styleable>

</resources>

  2 自定义 WeiXinTabChangeView类

          public classWeiXinTabChangeViewextendsRelativeLayout {

privateContextmContext;

private booleanisChecked;//tab是否被选中

privateStringtable_title;//tab的标题

private  floattabTitleSize;//标题的字体大小

private  inttabTitleColor;//字体的颜色

//标题

privateTextViewtitle_one;

//二层标题

privateTextViewtitle_two;

//图标

privateDrawabletabIcon;

privateImageViewimageview_one;

//二层图标

privateDrawabletabIcon_two;

privateImageViewimageview_two;

//透明度

private floatmAlpha=1f;

private inttitleNolColor= Color.GRAY;

publicWeiXinTabChangeView(Context context) {

super(context);

}

publicWeiXinTabChangeView(Context context,AttributeSet attrs) {

super(context,attrs);

TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.WinXinTabView);//获取TypedArray从而获取属性

isChecked= typedArray.getBoolean(R.styleable.WinXinTabView_tabChecked, false);

table_title= typedArray.getString(R.styleable.WinXinTabView_tabTitle);

tabTitleSize= typedArray.getDimension(R.styleable.WinXinTabView_tabTitleSize,20);

tabTitleColor= typedArray.getColor(R.styleable.WinXinTabView_tabTitleColor,Color.GRAY);

tabIcon= typedArray.getDrawable(R.styleable.WinXinTabView_tabIcon);

tabIcon_two= typedArray.getDrawable(R.styleable.WinXinTabView_tabIconOver);

typedArray.recycle();

mContext= context;

initView();

}

publicWeiXinTabChangeView(Context context,AttributeSet attrs, intdefStyleAttr) {

super(context,attrs,defStyleAttr);

}

//初始化控件

private voidinitView() {

RelativeLayout.LayoutParams titleLayoutParams =newRelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);//父容器底部

titleLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);

//二层标题

title_two=newTextView(mContext);

title_two.setId(R.id.title_two);//设置id

title_two.setLayoutParams(titleLayoutParams);

this.addView(title_two);//二层标题添加到 控件中

//标题

title_one=newTextView(mContext);

title_one.setId(R.id.title_one);

title_one.setLayoutParams(titleLayoutParams);

this.addView(title_one);

//图标的layoutparams

RelativeLayout.LayoutParams iconLayoutParams =newRelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

iconLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);

iconLayoutParams.addRule(RelativeLayout.ABOVE,R.id.title_one);

//二层图标

imageview_two=newImageView(mContext);

imageview_two.setId(R.id.image_two);

imageview_two.setLayoutParams(iconLayoutParams);

this.addView(imageview_two);

//图标

imageview_one=newImageView(mContext);

imageview_one.setId(R.id.image_one);

imageview_one.setLayoutParams(iconLayoutParams);

this.addView(imageview_one);

//设置数据并刷新

refreshData();

}

private voidrefreshData() {

mAlpha=1;

setTitleOne();

setTitleTwo();

setIconOne();

setIconTwo();

}

//设置二层图标

private voidsetIconTwo() {

imageview_two.setImageDrawable(tabIcon_two);

if(isChecked){

imageview_two.setAlpha(mAlpha);

}else{

imageview_two.setAlpha(1-mAlpha);

}

}

//设置 一层 图标

private voidsetIconOne() {

imageview_one.setImageDrawable(tabIcon);

if(isChecked){

imageview_one.setAlpha(1-mAlpha);

}else{

imageview_one.setAlpha(mAlpha);

}

}

//设置 二层标题

private voidsetTitleTwo() {

title_two.setText(table_title);

title_two.setTextColor(tabTitleColor);

if(isChecked){

title_two.setAlpha(mAlpha);

}else{

title_two.setAlpha(1-mAlpha);

}

}

//设置标题的

private voidsetTitleOne() {

title_one.setText(table_title);

title_one.setTextColor(titleNolColor);

if(isChecked){

title_one.setAlpha(1-mAlpha);

}else{

title_one.setAlpha(mAlpha);

}

}

/**

*设置选中状态

* */

public voidsetChecked(booleanisChecked) {

this.isChecked= isChecked;

setCheckedData();

}

/**

*选中之后重新设置数据

* */

private voidsetCheckedData(){

refreshData();

}

/**

*滑动时改变颜色

* */

public voidonScrolling(floatalpha){

mAlpha= alpha;

onScrollSetData();

}

/**

*滑动时设置图标透明度以及文字透明度

* */

private voidonScrollSetData(){

//设置图标透明度

imageview_one.setAlpha(1-mAlpha);

imageview_two.setAlpha(mAlpha);

//设置标题透明度

title_one.setAlpha(1-mAlpha);

title_two.setAlpha(mAlpha);

}

publicStringgetTitleText() {

returntable_title;

}

public voidsetTitleText(String titleText) {

this.table_title= titleText;

}

publicDrawablegetTabIcon() {

returntabIcon;

}

public voidsetTabIcon(Drawable tabIcon) {

this.tabIcon= tabIcon;

}

public booleanisChecked() {

returnisChecked;

}

publicImageViewgetIconImageView() {

returnimageview_one;

}

}



二 自定义 一个 viewGroup 来存放 WeiXinTabChangeView


public classTabGroupViewextendsLinearLayout {

privateArrayListtabViewList;

privateWeiXinTabVieOnItemClickweiXinTabVieOnItemClick;

publicTabGroupView(Context context) {

this(context,null);

}

publicTabGroupView(Context context,AttributeSet attrs) {

super(context,attrs);

tabViewList=newArrayList();

//设置默认的 水平布局

this.setOrientation(HORIZONTAL);

}

/**

*选中某一个

* */

public voidsetCurrentItem(intitem){

changeItem();

WeiXinTabChangeView weiXinTab =tabViewList.get(item);

weiXinTab.setChecked(true);

}

/**

*清除选中状态

* */

private voidchangeItem(){

for(WeiXinTabChangeView weiXinTab :tabViewList){

weiXinTab.setChecked(false);

}

}

/**

*@paramposition当前界面索引

*@parampositionOffset滑动的百分比

* */

public voidonPageScrolling(intposition, floatpositionOffset) {

if(positionOffset>0){

WeiXinTabChangeView weiXinTab =tabViewList.get(position);

weiXinTab.onScrolling(1-positionOffset);

if(position+1

WeiXinTabChangeView nextweiXinTab =tabViewList.get(position+1);

nextweiXinTab.onScrolling(positionOffset);

}

}

}

/**

*点击事件

* */

public interfaceWeiXinTabVieOnItemClick{

voidonClick(intposition,WeiXinTabChangeView tabLayout);

}

/**

*设置每个Item的监听事件

* */

public voidsetOnItemClickListener(WeiXinTabVieOnItemClick weiXinTabVieOnItemClick) {

this.weiXinTabVieOnItemClick= weiXinTabVieOnItemClick;

initListener();

}

/**

*设置监听器

* */

private voidinitListener(){

intcount =this.getChildCount();

for(inti=0;i

finalWeiXinTabChangeView weiXinTab = (WeiXinTabChangeView)this.getChildAt(i);

tabViewList.add(weiXinTab);

final intfinalI = i;

weiXinTab.setOnClickListener(newOnClickListener() {

@Override

public voidonClick(View v) {

changeItem();//清除选中状态

weiXinTab.setChecked(true);

if(weiXinTabVieOnItemClick!=null){

weiXinTabVieOnItemClick.onClick(finalI,weiXinTab);

}

}

});

}

}

/**

*设置只能水平布局

* */

@Override

public voidsetOrientation(intorientation) {

super.setOrientation(HORIZONTAL);

}

}


三 使用方法  

1 布局中的使用方式

<?xml version="1.0"encoding="utf-8"?>

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

xmlns:lishuai="http://schemas.android.com/apk/res-auto"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.lishuai.copyweixinhomedemo.ui.MainActivity">


<com.example.lishuai.copyweixinhomedemo.view.TabGroupView

android:id="@+id/tgv_weixingroup"

android:layout_alignParentBottom="true"

android:layout_width="match_parent"

android:layout_height="55dp"

android:paddingBottom="5dp"

android:paddingTop="5dp"

>

<com.example.lishuai.copyweixinhomedemo.view.WeiXinTabChangeView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/tab_main"

android:layout_weight="1"

lishuai:tabTitle="微信"

lishuai:tabTitleColor="#FBA615"

lishuai:tabIcon="@mipmap/tab_1_false"

lishuai:tabIconOver="@mipmap/tab_1_true"

lishuai:tabChecked="true"/>


<com.example.lishuai.copyweixinhomedemo.view.WeiXinTabChangeView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

lishuai:tabTitle="微信"

lishuai:tabTitleColor="#FBA615"

lishuai:tabIcon="@mipmap/tab_1_false"

lishuai:tabIconOver="@mipmap/tab_1_true"

/>


<com.example.lishuai.copyweixinhomedemo.view.WeiXinTabChangeView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

lishuai:tabTitle="微信"

lishuai:tabTitleColor="#FBA615"

lishuai:tabIcon="@mipmap/tab_1_false"

lishuai:tabIconOver="@mipmap/tab_1_true"

/>


<com.example.lishuai.copyweixinhomedemo.view.WeiXinTabChangeView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

lishuai:tabTitle="微信"

lishuai:tabTitleColor="#FBA615"

lishuai:tabIcon="@mipmap/tab_1_false"

lishuai:tabIconOver="@mipmap/tab_1_true"

/>

</com.example.lishuai.copyweixinhomedemo.view.TabGroupView>

<android.support.v4.view.ViewPager

android:id="@+id/viewpager"

android:layout_above="@id/tgv_weixingroup"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

</RelativeLayout>


2代码中使用


public classMainActivityextendsAppCompatActivity {

privateTabGroupViewtabGroupView;

privateViewPagerviewpager;

private    intmPosition=0;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private voidinitView() {

tabGroupView= (TabGroupView) findViewById(R.id.tgv_weixingroup);

viewpager= (ViewPager) findViewById(R.id.viewpager);

tabGroupView.setOnItemClickListener(newTabGroupView.WeiXinTabVieOnItemClick() {

@Override

public voidonClick(intposition,WeiXinTabChangeView tabLayout) {

Log.i("dfdf","选中的tablayout="+ position);

viewpager.setCurrentItem(position,false);

}

});

viewpager.setAdapter(newMainPagerAdapter(getSupportFragmentManager()));

viewpager.addOnPageChangeListener(newViewPager.OnPageChangeListener() {

@Override

public voidonPageScrolled(intposition, floatpositionOffset, intpositionOffsetPixels) {

tabGroupView.onPageScrolling(position,positionOffset);

}

@Override

public voidonPageSelected(intposition) {

mPosition= position;

tabGroupView.setCurrentItem(position);

}

@Override

public voidonPageScrollStateChanged(intstate) {

}

});

}

}


3 MainPagerAdapter

public classMainPagerAdapterextendsFragmentPagerAdapter {

publicMainPagerAdapter(FragmentManager fm) {

super(fm);

}

@Override

publicFragmentgetItem(intposition) {

returnFragmentFactory.create(position);

}

@Override

public intgetCount() {

return4;

}

}


4 FragmentFactory

public classFragmentFactory {

public  staticFragmentcreate(intposition){

Fragment fragment =null;

switch(position) {

case0:

fragment =newWeiXinFragment();

break;

case1:

fragment =newTongXunLuFragment();

break;

case2:

fragment =newFindFragment();

break;

case3:

fragment =newMeFragment();

break;

}

returnfragment;

}

}


5 Fragment


public classWeiXinFragmentextendsFragment {

@Nullable

@Override

publicViewonCreateView(LayoutInflater inflater,@NullableViewGroup container,@NullableBundle savedInstanceState) {

TextView textView =newTextView(getActivity());

textView.setText(getClass().getSimpleName());

returntextView;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,078评论 2 44
  • Correctness AdapterViewChildren Summary: AdapterViews can...
    MarcusMa阅读 8,816评论 0 6
  • 本人初学Android,最近做了一个实现安卓简单音乐播放功能的播放器,收获不少,于是便记录下来自己的思路与知识总结...
    落日柳风阅读 18,801评论 2 41
  • 这是一本讲述一帮大学毕业生,在步入社会时一边迷茫,一边挣扎,一边拼搏的书。 这是一个杜撰的故事,而每个故事都能在你...
    冷月夜箜篌阅读 298评论 0 0
  • 前几天,学校里有个写作大赛,我很想参加。但我又很自卑,因为我从小到大没参加过几次这样的比赛,而且参加的全失败了。因...
    鹤琹阅读 622评论 4 4