Android之仿微信Tab滑动

这个项目实现了以下的功能:有三个标签聊天、发现和通讯录,左右滑动下面的ViewPager可以切换不同的标签,且标签下面的蓝色条可以随着手指的滑动来实时滑动。另外,如果第二次滑动到“聊天”界面,可以在“聊天”旁边添加一个“七条信息”的BadgeView。具体的运行效果如下。

 

下面上代码。顺便说一下,使用BadgeView的话,我们需要导入它的JAR包,点击这里下载。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="40.0dip"
 6     android:background="@drawable/topbar_bg" >
 7
 8     <LinearLayout
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:gravity="center"
12         android:orientation="horizontal"
13         android:paddingLeft="10.0dip" >
14
15         <ImageView
16             android:layout_width="30.0dip"
17             android:layout_height="wrap_content"
18             android:layout_marginRight="5.0dip"
19             android:contentDescription="@string/app_name"
20             android:src="@drawable/topbar_icon" />
21
22         <TextView
23             android:layout_width="wrap_content"
24             android:layout_height="wrap_content"
25             android:text="微信"
26             android:textColor="#d3d3d3"
27             android:textSize="18.0sp" />
28     </LinearLayout>
29
30     <LinearLayout
31         android:layout_width="wrap_content"
32         android:layout_height="wrap_content"
33         android:layout_alignParentRight="true"
34         android:orientation="horizontal" >
35
36         <ImageView
37             android:layout_width="30.0dip"
38             android:layout_height="wrap_content"
39             android:layout_marginRight="5.0dip"
40             android:contentDescription="@string/app_name"
41             android:src="@drawable/topbar_search" />
42
43         <ImageView
44             android:layout_width="30.0dip"
45             android:layout_height="wrap_content"
46             android:layout_marginRight="5.0dip"
47             android:contentDescription="@string/app_name"
48             android:src="@drawable/topbar_add" />
49
50         <ImageView
51             android:layout_width="30.0dip"
52             android:layout_height="wrap_content"
53             android:layout_marginRight="5.0dip"
54             android:contentDescription="@string/app_name"
55             android:src="@drawable/topbar_more" />
56     </LinearLayout>
57
58 </RelativeLayout>

追上面一条的布局代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="30.0dip"
 5     android:background="#eee"
 6     android:orientation="vertical" >
 7
 8     <LinearLayout
 9         android:layout_width="fill_parent"
10         android:layout_height="27.0dip"
11         android:orientation="horizontal" >
12
13         <LinearLayout
14             android:id="@+id/tabbar_chat_layout"
15             android:layout_width="0.0dip"
16             android:layout_height="match_parent"
17             android:layout_weight="1"
18             android:gravity="center"
19             android:orientation="horizontal" >
20
21             <TextView
22                 android:id="@+id/tabbar_tchat"
23                 android:layout_width="wrap_content"
24                 android:layout_height="wrap_content"
25                 android:text="聊天"
26                 android:textColor="#008000"
27                 android:textSize="15.0sp" />
28         </LinearLayout>
29
30         <LinearLayout
31             android:layout_width="0.0dip"
32             android:layout_height="match_parent"
33             android:layout_weight="1"
34             android:gravity="center" >
35
36             <TextView
37                 android:id="@+id/tabbar_tdiscover"
38                 android:layout_width="wrap_content"
39                 android:layout_height="wrap_content"
40                 android:text="发现"
41                 android:textColor="#ff000000"
42                 android:textSize="15.0sp" />
43         </LinearLayout>
44
45         <LinearLayout
46             android:layout_width="0.0dip"
47             android:layout_height="match_parent"
48             android:layout_weight="1"
49             android:gravity="center" >
50
51             <TextView
52                 android:id="@+id/tabbar_tconn"
53                 android:layout_width="wrap_content"
54                 android:layout_height="wrap_content"
55                 android:text="通讯录"
56                 android:textColor="#ff000000"
57                 android:textSize="15.0sp" />
58         </LinearLayout>
59     </LinearLayout>
60
61     <ImageView
62         android:id="@+id/tabbar_tabline"
63         android:layout_width="100.0dip"
64         android:layout_height="3.0dip"
65         android:background="@drawable/tabline"
66         android:contentDescription="@string/app_name" />
67
68 </LinearLayout>

标签条的布局代码

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6
 7     <include layout="@layout/sideworks_topbar" />
 8
 9     <include layout="@layout/sideworks_tabbar" />
10
11     <android.support.v4.view.ViewPager
12         android:id="@+id/viewpager"
13         android:layout_width="fill_parent"
14         android:layout_height="0.0dip"
15         android:layout_weight="1" >
16     </android.support.v4.view.ViewPager>
17
18 </LinearLayout>

MainActivity界面布局代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:background="#ffffffff" >
 6
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:layout_centerInParent="true"
11         android:text="This is CHAT fragment page."
12         android:textColor="#ff000000"
13         android:textSize="22.0sp" />
14
15 </RelativeLayout>

第一个标签页的布局代码(三个标签页布局一样,这里只列出第一个)

  1 public class MainActivity extends FragmentActivity {
  2     private ViewPager viewPager;
  3     private FragmentPagerAdapter adapter;
  4     private List<Fragment> data;
  5     private TextView tChat, tDiscover, tConn;
  6     private LinearLayout chatLayout;
  7     private BadgeView badgeView;
  8     private ImageView tabLine;
  9     private int widthTabLine;
 10     private int currentPageIndex;
 11
 12     @Override
 13     protected void onCreate(Bundle savedInstanceState) {
 14         super.onCreate(savedInstanceState);
 15         setContentView(R.layout.activity_main);
 16
 17         initView();
 18     }
 19
 20     // 设置TabLine长度占屏幕的三分之一
 21     private void initTabLine() {
 22         // 获取屏幕宽度1/3的长度
 23         DisplayMetrics metrics = new DisplayMetrics();
 24         getWindow().getWindowManager().getDefaultDisplay().getMetrics(metrics);
 25         widthTabLine = metrics.widthPixels / 3;
 26         // 设置宽度占1/3
 27         LayoutParams layoutParams = (LayoutParams) tabLine.getLayoutParams();
 28         layoutParams.width = widthTabLine;
 29         tabLine.setLayoutParams(layoutParams);
 30     }
 31
 32     private void initView() {
 33         viewPager = (ViewPager) findViewById(R.id.viewpager);
 34         tChat = (TextView) findViewById(R.id.tabbar_tchat);
 35         tDiscover = (TextView) findViewById(R.id.tabbar_tdiscover);
 36         tConn = (TextView) findViewById(R.id.tabbar_tconn);
 37         chatLayout = (LinearLayout) findViewById(R.id.tabbar_chat_layout);
 38         tabLine = (ImageView) findViewById(R.id.tabbar_tabline);
 39
 40         initTabLine();
 41
 42         data = new ArrayList<Fragment>();
 43
 44         // ViewPager的三个页面
 45         ChatTabPage chatTabPage = new ChatTabPage();
 46         DiscoverTabPage discoverTabPage = new DiscoverTabPage();
 47         ConnTabPage connTabPage = new ConnTabPage();
 48         data.add(chatTabPage);
 49         data.add(discoverTabPage);
 50         data.add(connTabPage);
 51
 52         adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
 53             @Override
 54             public int getCount() {
 55                 return data.size();
 56             }
 57
 58             @Override
 59             public Fragment getItem(int position) {
 60                 return data.get(position);
 61             }
 62         };
 63
 64         viewPager.setAdapter(adapter);
 65
 66         // ViewPager滑动结束后,改变Tabbar中的字体颜色
 67         viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 68             @Override
 69             public void onPageSelected(int position) {
 70                 resetTextView();
 71                 switch (position) {
 72                 case 0:
 73                     // 当滑动回第一个页面时,在“聊天”旁边增加一个“七条信息”的提示
 74                     if (badgeView != null) {
 75                         chatLayout.removeView(badgeView);
 76                     }
 77                     badgeView = new BadgeView(MainActivity.this);
 78                     tChat.setTextColor(Color.parseColor("#008000"));
 79                     badgeView.setBadgeCount(7);
 80                     chatLayout.addView(badgeView);
 81                     break;
 82                 case 1:
 83                     tDiscover.setTextColor(Color.parseColor("#008000"));
 84                     break;
 85                 case 2:
 86                     tConn.setTextColor(Color.parseColor("#008000"));
 87                     break;
 88                 }
 89                 currentPageIndex = position;
 90             }
 91
 92             @Override
 93             public void onPageScrolled(int position, float positionOffset, int positionOffsetPx) {
 94                 // TabLine随着手指滑动而变化位置
 95                 LayoutParams layoutParams = (LayoutParams) tabLine.getLayoutParams();
 96                 if (currentPageIndex == position) {
 97                     layoutParams.leftMargin = (int) ((positionOffset + currentPageIndex) * widthTabLine);
 98                 } else {
 99                     layoutParams.leftMargin = (int) ((positionOffset - 1 + currentPageIndex) * widthTabLine);
100                 }
101                 tabLine.setLayoutParams(layoutParams);
102             }
103
104             @Override
105             public void onPageScrollStateChanged(int arg0) {
106
107             }
108         });
109     }
110
111     // 重置三个TextView的字体颜色
112     protected void resetTextView() {
113         tChat.setTextColor(Color.BLACK);
114         tDiscover.setTextColor(Color.BLACK);
115         tConn.setTextColor(Color.BLACK);
116     }
117 }

MainActivity中的JAVA代码

时间: 2024-11-06 07:41:25

Android之仿微信Tab滑动的相关文章

Android PopupWindow 仿微信弹出效果

项目中,我需要PopupWindow的时候特别多,这个东西也特别的好使,所以我今天给大家写一款PopupWindow 仿微信弹出效果,这样大家直接拿到项目里就可以用了!首先让我们先看效果: 那么我首先先看下布局代码非常简单:如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pop_layout" android:layout_

Android高仿QQ消息滑动删除(附源码)

大家都应该使用过QQ吧,他的消息中可以滑动删除功能,我觉得比较有意思,所以模仿写了一个,并且修改了其滑动算法.我先贴几个简单示范图吧 其实主要用的是算法以及对ListView的把控. 一下是适配器的类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

[转]Android 超高仿微信图片选择器 图片该这么加载

快速加载本地图片缩略图的方法: Android 超高仿微信图片选择器 图片该这么加载 其示例下载: 仿微信图片选择器 ImageLoader

Android ActionBar仿微信界面

ActionBar仿微信界面 1.学习了别人的两篇关于ActionBar博客,在结合别人的文章来仿造一下微信的界面: 思路如下:1).利用ActionBar生成界面的头部,在用ActionBar的ActionProvider时候要注意引入的包一定是android.view.ActionProvider,不能是android.support.v4.view.ActionProvider 2),切换的Title可以参考之前之前一篇文章利用RadioGroup来做,这里是利用一个开源的项目PagerS

Android 高仿微信实时聊天 基于百度云推送

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~ 首先特别感谢:weidi1989分享的Android之基于百度云推送IM ,大家可以直接下载:省了很多事哈,本例中也使用了weidi的部分代码,凡是@author way的就是weidi1989的代码~~ 1.效果图 核心功能也就上面的两张图了~~~我拿着手机和模拟器

Android 高仿微信6.0主界面 带你玩转切换图标变色

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41087219,本文出自:[张鸿洋的博客] 1.概述 学习Android少不了模仿各种app的界面,自从微信6.0问世以后,就觉得微信切换时那个变色的Tab图标屌屌的,今天我就带大家自定义控件,带你变色变得飞起~~ 好了,下面先看下效果图: 清晰度不太好,大家凑合看~~有木有觉得这个颜色弱爆了了的,,,下面我动动手指给你换个颜色: 有没有这个颜色比较妖一点~~~好了~下面开始介绍

Android高仿微信图片选择上传工具

源码托管地址:https://github.com/SleepyzzZ/photo-selector 话不多说,先上效果图(高仿微信图片选择器): 图片选择界面: 图片预览界面: 批量上传图片: 实现的功能介绍: 1.图片异步加载,使用Glide开源库实现加载; 2.图片的预览界面,支持左右滑动,双击放大浏览; 3.图片批量上传,使用OkHttp来实现与Servlet服务器的通信; 使用方法(Android Studio): 新建工程,File->New->Import Module导入pho

Android 高仿微信图片选择器(瀑布流)

前言 在很多很多的项目中,都有选择本地图片的功能,现在就带大家做一个仿微信的图片选择器 1.和微信相比,由于博主是平板,微信在博主的平板中的图片是很模糊的,而我们的这个比微信的清晰,但是代价基本就是内存的多消耗,但是现在的收集基本上这点内存还是有的,图片也是经过压缩的 2.和鸿洋封装的相比,有些人可能会说和大神的有可比性么?我可以很直白的说这个图片选择器就是参考鸿洋大神以前封装的图片选择器,并且进行代码的分层.逻辑的重新梳理.优化显示效果.去除很多难懂的代码,用浅显易懂的代码实现之!,并且图片的

Android高仿微信头像裁剪

最近公司的APP很多用户反应无法上传头像,于是打算修改原来头像裁剪的代码.参考微信.QQ.唱吧头像裁剪的操作,决定就仿微信头像裁剪来上传用户头像,在Android大神鸿洋的一篇高仿微信头像的博客(博客地址结尾会贴出来)的基础上加了一些代码,加的代码主要增加如下的功能: 1.增加对大图的处理,缩放到我们裁剪框的大小. 2.裁剪后的图片保存到临时文件里,把临时文件的路径返回到需要处理的界面,因为在三星S4传byte数组返回数据时会闪退,传路径则正常. 3.对有些系统返回旋转过的图片进行处理. 这个功