仿微信多页滑动

1.添加三个Fragment

  MsgFragment 消息

  CCFragment  发现

  UserFragment 我

2.添加标签栏(GridView) 用来放置下方的按钮控件

  activity_main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:app="http://schemas.android.com/apk/res-auto"
 5     xmlns:tools="http://schemas.android.com/tools"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     tools:context="com.example.senior0302_test2.MainActivity"
 9     android:orientation="vertical">
10
11
12     <view
13         android:id="@+id/id_viewpager"
14         class="android.support.v4.view.ViewPager"
15         android:layout_weight="1"
16         android:layout_width="match_parent"
17         android:layout_height="0dp"/>
18
19     <!--中间的分割线-->
20     <View android:layout_width="match_parent"
21           android:layout_height="1dp"
22           android:background="#ccc" />
23
24
25     <GridView
26         android:id="@+id/id_gridview"
27         android:layout_width="match_parent"
28         android:layout_height="wrap_content"/>
29 </LinearLayout>

3.构造类AfTabBarAdapter.java   该类继承于BaseAdapter

  AfTabBarAdapter.java

  1 package example.senior0301;
  2
  3 import android.content.Context;
  4 import android.graphics.Color;
  5 import android.graphics.drawable.Drawable;
  6 import android.view.LayoutInflater;
  7 import android.view.View;
  8 import android.view.ViewGroup;
  9 import android.widget.BaseAdapter;
 10 import android.widget.ImageView;
 11 import android.widget.TextView;
 12
 13 import java.util.ArrayList;
 14
 15 /**
 16  * Created by shaofa on 2017/12/9.
 17  */
 18
 19 public class AfTabBarAdapter extends BaseAdapter
 20 {
 21     Context context;
 22     LayoutInflater inflater;
 23
 24     // 颜色也字体
 25     int colorNormal = Color.argb(0xFF, 0x44, 0x44, 0x44);
 26     int colorActive = Color.argb(0xFF, 0x00, 0xFF, 0x00);
 27
 28     // 标签项数据
 29     ArrayList<Item> listData = new ArrayList();
 30
 31     public AfTabBarAdapter(Context context)
 32     {
 33         this.context = context;
 34         this.inflater = LayoutInflater.from(context);
 35     }
 36
 37     // 添加一项数据
 38     public void addItem(Item it)
 39     {
 40         listData.add(it);
 41     }
 42     // 添加多项数据
 43     public void addItems(Item[] items)
 44     {
 45         for(Item it:items) listData.add(it);
 46     }
 47     // 当一个项被选中时 图片跟标签的样式
 48     public void setActive(int position, boolean update)
 49     {
 50         //遍历看一共有几个标签按钮
 51         for(int i=0; i<listData.size(); i++)
 52         {
 53             //获取每个按钮
 54             Item it = listData.get(i);
 55
 56             //如果遍历道的按钮跟所点击或移动的一样 则设置相应的值
 57             if(i == position)
 58                 it.active = true;
 59             else
 60                 it.active = false;
 61         }
 62         if(update) notifyDataSetChanged();
 63     }
 64
 65     @Override
 66     public int getCount()
 67     {
 68         return listData.size();
 69     }
 70
 71     @Override
 72     public Object getItem(int position)
 73     {
 74         return listData.get(position);
 75     }
 76
 77     @Override
 78     public long getItemId(int position)
 79     {
 80         return position;
 81     }
 82
 83     @Override
 84     public View getView(int position, View convertView, ViewGroup parent)
 85     {
 86         // 创建控件
 87         if (convertView == null)
 88         {
 89             convertView = inflater.inflate(R.layout.af_tab_bar_item, parent, false);
 90         }
 91
 92         // 获取/显示数据
 93         Item it = (Item) getItem(position);
 94         TextView label = (TextView) convertView.findViewById(R.id.id_tabbar_label);
 95         ImageView imageView = (ImageView) convertView.findViewById(R.id.id_tabbar_icon);
 96
 97         label.setText( it.label);
 98
 99         if (it.active)
100         {
101             // 选中状态
102             if (it.label.length() > 0)
103                 label.setTextColor(colorActive);
104             if (it.iconActive != null)
105                 imageView.setImageDrawable( it.iconActive);
106             else // iconActive未设置,则显示iconNormal  如果没有放置图片时
107                 imageView.setImageDrawable( it.iconNormal);
108         } else
109         {
110             // 普通状态
111             if (it.label.length() > 0)
112                 label.setTextColor(colorNormal);
113             if (it.iconNormal != null)
114                 imageView.setImageDrawable( it.iconNormal);
115         }
116
117         return convertView;
118     }
119
120     ///////////////////////////////
121     public static class Item
122     {
123         String label;  // 标签显示
124         String value;   // 关联的数据
125         public Drawable iconNormal; // 图标
126         public Drawable iconActive; // 选中高亮
127         public boolean active = false; // 是否选中状态
128
129         public Item()
130         {
131         }
132
133         public Item(String label, String value)
134         {
135             this.label = label;
136             this.value = value;
137         }
138         public Item(String label, String value, Drawable iconNormal, Drawable iconActive)
139         {
140             this.label = label;
141             this.value = value;
142             this.iconNormal = iconNormal;
143             this.iconActive = iconActive;
144         }
145     }
146 }

4.MainActivity.java中

  a.创建一个Fragment的数组  页面数组

 Fragment[] fragments = new Fragment[3];

  b.初始化三个创建的页面

     fragments[0] = new MsgFragment();
        fragments[1] = new CCFragment();
        fragments[2] = new UserFragment();

   c.创建内部类 MyViewPagerAdapter

    public class MyViewPagerAdapter extends FragmentPagerAdapter
    {

        public MyViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            //?????????
            return fragments[position];

        }

        @Override
        public int getCount() {
            //?????????
            return fragments.length;
        }
    }

  d.给viewPage 设置Adapter

  

1      FragmentPagerAdapter pagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
2         final ViewPager viewPager=(ViewPager)findViewById(R.id.id_viewpager);
3         viewPager.setAdapter(pagerAdapter);

  e.设置标签栏中的内容

1      AfTabBarAdapter.Item[] labels=new AfTabBarAdapter.Item[3];
2         labels[0]=new AfTabBarAdapter.Item("微信","msg",getDrawable(R.drawable.ic_msg_active),getDrawable(R.drawable.ic_msg_normal));
3         labels[1]=new AfTabBarAdapter.Item("发现","cc",getDrawable(R.drawable.ic_find_active),getDrawable(R.drawable.ic_find_normal));
4         labels[2]=new AfTabBarAdapter.Item("我的","user",getDrawable(R.drawable.ic_user_active),getDrawable(R.drawable.ic_user_normal));
      
tabAdapter=new AfTabBarAdapter(this);tabAdapter.addItems(labels);

   f.给标签栏的主体 GridView设置Adapter

  

        GridView gridView=(GridView)findViewById(R.id.id_gridview);
        gridView.setAdapter(tabAdapter);
        gridView.setNumColumns(labels.length);//GridView设置 列
        tabAdapter.setActive(0,true);//默认选中第一页  第一个标签

    g.监听器:点击标签页 显示相应的页面

  

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

                //让pagerVier切换到相应的页面
                viewPager.setCurrentItem(position);

                //让标签按钮改变选相应的样式
                tabAdapter.setActive(position,true);
            }
        });

    h.监听器:当滑动上方页面时

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {

            //让标签栏该改变相应的样式
            tabAdapter.setActive(position,true);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

MainActivity.java

  1 package com.example.senior0302_test2;
  2
  3 import android.os.Bundle;
  4 import android.support.v4.app.Fragment;
  5 import android.support.v4.app.FragmentManager;
  6 import android.support.v4.app.FragmentPagerAdapter;
  7 import android.support.v4.view.ViewPager;
  8 import android.support.v7.app.AppCompatActivity;
  9 import android.view.View;
 10 import android.widget.AdapterView;
 11 import android.widget.GridView;
 12
 13 public class MainActivity extends AppCompatActivity {
 14
 15     Fragment[] fragments = new Fragment[3];
 16     AfTabBarAdapter tabAdapter;
 17
 18
 19     @Override
 20     protected void onCreate(Bundle savedInstanceState) {
 21         super.onCreate(savedInstanceState);
 22         setContentView(R.layout.activity_main);
 23
 24         //将页面初始化
 25         fragments[0] = new MsgFragment();
 26         fragments[1] = new CCFragment();
 27         fragments[2] = new UserFragment();
 28
 29         FragmentPagerAdapter pagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
 30         final ViewPager viewPager=(ViewPager)findViewById(R.id.id_viewpager);
 31         viewPager.setAdapter(pagerAdapter);
 32
 33         //设置标签栏中的内容
 34         AfTabBarAdapter.Item[] labels=new AfTabBarAdapter.Item[3];
 35         labels[0]=new AfTabBarAdapter.Item("微信","msg",getDrawable(R.drawable.ic_msg_active),getDrawable(R.drawable.ic_msg_normal));
 36         labels[1]=new AfTabBarAdapter.Item("发现","cc",getDrawable(R.drawable.ic_find_active),getDrawable(R.drawable.ic_find_normal));
 37         labels[2]=new AfTabBarAdapter.Item("我的","user",getDrawable(R.drawable.ic_user_active),getDrawable(R.drawable.ic_user_normal));
 38
 39         tabAdapter=new AfTabBarAdapter(this);
 40         tabAdapter.addItems(labels);
 41
 42         GridView gridView=(GridView)findViewById(R.id.id_gridview);
 43         gridView.setAdapter(tabAdapter);
 44         gridView.setNumColumns(labels.length);//GridView设置 列
 45         tabAdapter.setActive(0,true);//默认选中第一页  第一个标签
 46
 47         //监听器:点击标签页  显示相应的页面
 48         gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 49             @Override
 50             public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
 51
 52                 //让pagerVier切换到相应的页面
 53                 viewPager.setCurrentItem(position);
 54
 55                 //让标签按钮改变选相应的样式
 56                 tabAdapter.setActive(position,true);
 57             }
 58         });
 59
 60         //监听器:当滑动上方页面时
 61         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 62             @Override
 63             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 64
 65             }
 66
 67             @Override
 68             public void onPageSelected(int position) {
 69
 70                     //让标签栏该改变相应的样式
 71                     tabAdapter.setActive(position,true);
 72             }
 73
 74             @Override
 75             public void onPageScrollStateChanged(int state) {
 76
 77             }
 78         });
 79     }
 80
 81     public class MyViewPagerAdapter extends FragmentPagerAdapter
 82     {
 83
 84         public MyViewPagerAdapter(FragmentManager fm) {
 85             super(fm);
 86         }
 87
 88         @Override
 89         public Fragment getItem(int position) {
 90             //?????????
 91             return fragments[position];
 92
 93         }
 94
 95         @Override
 96         public int getCount() {
 97             //?????????
 98             return fragments.length;
 99         }
100     }
101 }

原文地址:https://www.cnblogs.com/Doaoao/p/9420615.html

时间: 2024-10-17 00:36:10

仿微信多页滑动的相关文章

关于高仿微信对话列表滑动删除效果代码优化

原文:http://blog.csdn.net/singwhatiwanna/article/details/17515543 最近公司项目需用到微信滑动拉出按钮的效果,发现一位牛人已经实现了相关效果,但控件仍与业务代码存有耦合,于是花了点时间做了些去耦合,并于此进行记录,以防遗忘. 个人认为耦合主要在于两点: 第一点是SlideListView中的onTouchEvent 通过获取item间接得到SlideView,但这样会引入外部数据类MessageItem.          @Overr

高仿微信对话列表滑动删除效果(转)

前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突,也许你需要了解下android中点击事件的派发流程,请参考Android源码分析-点击事件派发机制.我的解决思路是这样的:重写ListView的onInterceptTouchEvent方法,在move的时候做判断,如果是左右滑动就返回false,否则返

【转】高仿微信对话列表滑动删除效果--不错

原文网址:http://blog.csdn.net/singwhatiwanna/article/details/17515543 转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17515543 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因

高仿微信对话列表滑动删除效果

前言 用过微信的都知道.微信对话列表滑动删除效果是非常不错的,这个效果我们也能够有. 思路事实上非常easy,弄个ListView.然后里面的每一个item做成一个能够滑动的自己定义控件就可以.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突.或许你须要了解下android中点击事件的派发流程,请參考Android源代码分析-点击事件派发机制.我的解决思路是这种:重写ListView的onInterceptTouchEvent方法,在move的时候做推断,假设是左右滑动就返回

安卓仿微信Tab页用Fragment实现

最终效果图如: 实现步骤: 新建项目tabdemo,我选的是4.0.3版本,然后依次新建三个Fragment,名字分别为:ChatFragment.FriendFragment.FindFragment,他会生成对应的界面布局xml文件. 项目资源管理器结构如下: Drawable中是用到的三张图片,可自行找然后粘进去. 对应的Java代码如下: package com.example.administrator.tabdemo; import android.content.Context;

如何做一个自己的开源聊天项目?(仿微信)

万事开头难 在我决定做开源是因为自身工作接触到大多数的项目都是基于开源大佬写的框架,自觉惭愧,工作以来一直忙于业务与功能实现,多多少少做过的几个项目也没能抽出部分好一点的功能业务Maven包什么的提供也同行使用或借鉴,这实在是有悖于自己的初心. 决定做开源是今年(2018)7月末的时候,自己曾做的一个Iot项目刚刚被几个网上的朋友问到,并寻求源码,那么久做了一个Demo,并放到了GitHub上. 之后感觉应该做一个有自己情感注入的项目才行,而不是工作上的现实交易的项目,我想做一个属于自己的项目,

Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文地址Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一),我们是通过官方自带的SlidingPaneLayout来实现的手势滑动返回.在这篇博文中,我们将採用SlidingMenu来高仿. 事实上实现的原理都一样.仅仅只是是把SlidingPaneLayout

【转】android 欢迎界面翻页成效,仿微信第一次登陆介绍翻页界面

android 欢迎界面翻页效果,仿微信第一次登陆介绍翻页界面 本实例做的相对比较简单主要是对翻页控件的使用,有时候想要做一些功能是主要是先了解下是否有现成的控件可以使用,做起来比较简单不用费太大的劲去找别的资料,或者别的办法设计.有空多读读android API了解熟悉了做什么都比较容易.(注意:ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar” 如果sdk是4.0及以上的

android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Material Design 化的 Xposed 模块 仿最新版微信 Rxjava+Retrofit+MVP+Glide 技术开发 android一键清理/内存加速,缓存清理,自启管理,软件管理 android打造酷炫下拉视差效果并解决各种滑动冲突源码 android实现UC浏览器首页滑动动画实现 andr