当前位置: 首页 > news >正文

高仿微信5.2.1主界面及消息提醒功能

项目演示效果如下:

一、项目布局如下
这里写图片描述

二、项目代码

package com.example.weichat5_2_1;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ChatMainTabFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // 加载相应的布局layout
        return inflater.inflate(R.layout.tab01, container, false);
    }
}
package com.example.weichat5_2_1;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ContactMainTabFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // 加载相应的布局layout
        return inflater.inflate(R.layout.tab03, container, false);
    }
}
package com.example.weichat5_2_1;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FriendMainTabFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // 加载相应的布局layout
        return inflater.inflate(R.layout.tab02, container, false);
    }
}
package com.example.weichat5_2_1;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.jauker.widget.BadgeView;

public class MainActivity extends FragmentActivity {

    private ViewPager mViewPager;
    private FragmentPagerAdapter mAdapter; // ViewPager中使用Fragment的适配器
    private List<Fragment> mDatas; // 在ViewPager中存放的三个Fragment

    // 导航栏的聊天、朋友、通讯录
    private TextView mChatTextView;
    private TextView mFriendTextView;
    private TextView mContactTextView;

    private LinearLayout mChatLinearLayout;
    private BadgeView mBadgeView;

    private ImageView mTabline;
    private int mScreen1_3;// 屏幕宽度的三分之一

    private int mCurrentPageIndex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        initTabLine();
        initView();
    }

    private void initTabLine() {
        mTabline = (ImageView) findViewById(R.id.id_iv_tabline); // 导航栏底部的指示条

        // 获得手机屏幕的宽度
        Display display = getWindow().getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics(); // outMetrics携带屏幕的宽度、高度等
        display.getMetrics(outMetrics);
        mScreen1_3 = outMetrics.widthPixels / 3;

        // 获得指示条的布局属性
        LayoutParams lp = mTabline.getLayoutParams();
        lp.width = mScreen1_3;
        mTabline.setLayoutParams(lp);
    }

    /**
     * 初始化方法,实现一系列findViewById
     * 
     * mDatas中数值的添加
     */
    private void initView() {
        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
        mChatTextView = (TextView) findViewById(R.id.id_tv_chat);
        mFriendTextView = (TextView) findViewById(R.id.id_tv_friend);
        mContactTextView = (TextView) findViewById(R.id.id_tv_contact);
        mChatLinearLayout = (LinearLayout) findViewById(R.id.id_ll_chat);

        mDatas = new ArrayList<Fragment>();

        ChatMainTabFragment tab01 = new ChatMainTabFragment();
        FriendMainTabFragment tab02 = new FriendMainTabFragment();
        ContactMainTabFragment tab03 = new ContactMainTabFragment();

        // 将Fragment加入存放Fragment的list
        mDatas.add(tab01);
        mDatas.add(tab02);
        mDatas.add(tab03);

        /*
         * 适配器的使用
         */
        mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return mDatas.size();
            }

            @Override
            public Fragment getItem(int position) {
                return mDatas.get(position);
            }
        };

        // 为ViewPager设置适配器
        mViewPager.setAdapter(mAdapter);

        // 为ViewPager设置页面改变事件
        mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

            /**
             * 当页面切换的时候改变顶部的字体颜色
             */
            @Override
            public void onPageSelected(int position) {

                // 当从第二个页面进入第一个页面的时候清除第一个页面的字体等
                resetTextView();

                switch (position) {
                case 0:// 进入第1个页面

                    // 为聊天界面设置浮动的红色字体
                    // 《!--这里使用了github上的开源框架BadgeView--》
                    if (mBadgeView != null) { // 如果已经有了则清除
                        mChatLinearLayout.removeView(mBadgeView);
                    }
                    mBadgeView = new BadgeView(MainActivity.this);
                    mBadgeView.setBadgeCount(7); // 设置数字
                    mChatLinearLayout.addView(mBadgeView);// 把mBadgeView加入到聊天的框中

                    // 设置字体为绿色
                    mChatTextView.setTextColor(Color.parseColor("#008000"));
                    break;
                case 1:// 进入第2个页面
                    mFriendTextView.setTextColor(Color.parseColor("#008000"));
                    break;
                case 2:// 进入第3个页面
                    mContactTextView.setTextColor(Color.parseColor("#008000"));
                    break;

                }

                mCurrentPageIndex = position;

            }

            /**
             * 当页面改变的时候,让导航栏底部的绿色指示条随着滑动
             */
            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPx) {

                // 打印日志,判断 position, positionOffset, positionOffsetPx的变化特点
                Log.e("TAG", position + " , " + positionOffset + " , "
                        + positionOffsetPx);

                LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) mTabline
                        .getLayoutParams();

                if (mCurrentPageIndex == 0 && position == 0)// 0->1:第0页到第1页
                {
                    lp.leftMargin = (int) (positionOffset * mScreen1_3 + mCurrentPageIndex
                            * mScreen1_3);
                } else if (mCurrentPageIndex == 1 && position == 0)// 1->0:第1页到第0页
                {
                    lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + (positionOffset - 1)
                            * mScreen1_3);
                } else if (mCurrentPageIndex == 1 && position == 1) // 1->2:第1页到第2页
                {
                    lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + positionOffset
                            * mScreen1_3);
                } else if (mCurrentPageIndex == 2 && position == 1) // 2->1:第2页到第1页
                {
                    lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + (positionOffset - 1)
                            * mScreen1_3);
                }
                mTabline.setLayoutParams(lp);

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

    }

    /**
     * 初始化导航栏中的字体颜色为黑色
     */
    protected void resetTextView() {
        mChatTextView.setTextColor(Color.BLACK);
        mFriendTextView.setTextColor(Color.BLACK);
        mContactTextView.setTextColor(Color.BLACK);
    }

}

三、布局文件

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <include layout="@layout/top1" />

    <include layout="@layout/top2" />

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

tab01.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is first Tab"
        android:textSize="22sp"
        android:textStyle="bold" />

</LinearLayout>

tab02.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is second Tab"
        android:textSize="22sp"
        android:textStyle="bold" />

</LinearLayout>

tab03.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is third Tab"
        android:textSize="22sp"
        android:textStyle="bold" />

</LinearLayout>

top1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/top1_bg"
    android:paddingLeft="12dp"
    android:paddingRight="12dp" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/actionbar_icon" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:text="微信"
            android:textColor="#d3d3d3"
            android:textSize="18sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/actionbar_search_icon" />

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/actionbar_add_icon" />

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/actionbar_more_icon" />
    </LinearLayout>

</RelativeLayout>

top2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="#eee"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="37dp"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/id_ll_chat"
            android:layout_width="3dp"
            android:orientation="horizontal"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >

            <TextView
                android:id="@+id/id_tv_chat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="聊天"
                android:textColor="#008000" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="3dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >

            <TextView
                android:id="@+id/id_tv_friend"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:text="发现" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="3dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:id="@+id/id_tv_contact"
                android:text="通讯录" />
        </LinearLayout>
    </LinearLayout>

    <ImageView
        android:id="@+id/id_iv_tabline"
        android:layout_width="100dp"
        android:layout_height="3dp"
        android:background="@drawable/tabline" />

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.weichat5_2_1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.weichat5_2_1.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

四、技术难点解释
(1)在使用消息提示功能的时候,我们使用了github上的开源框架,下载地址为:https://github.com/stefanjauker/BadgeView

(2)我们只需引入其中的jar即可
这里写图片描述

五、源码地址
http://download.csdn.net/detail/u010870518/8476951

相关文章:

  • 自定义DialogAlert对话框并实现对话框的复用
  • webservice作用(优,缺点;作用)
  • 如何修改Eclipse的背景颜色
  • 编程的智慧
  • 如何修改eclipse快捷键的组合方式
  • 在Application_Error获取Asp.Net未处理异常信息
  • Bmob的使用案例
  • easyui
  • Eclipse导入library的时候报:Found 2 versions of android-support-v4.jar in the dependency list
  • tomcat为什么无法关闭
  • Android项目编译的时候出现:Caused by: java.lang.ClassNotFoundException: com.example.aaa.MainActivity
  • dsadsa
  • 在一个千万级的数据库查寻中,如何提高查询效率?
  • SQLHelp帮助类
  • meta标签的作用详解
  • canvas 高仿 Apple Watch 表盘
  • CentOS 7 修改主机名
  • Docker: 容器互访的三种方式
  • JavaScript 基本功--面试宝典
  • JavaScript对象详解
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jQuery(一)
  • Linux链接文件
  • 阿里云购买磁盘后挂载
  • 关于for循环的简单归纳
  • 思否第一天
  • 听说你叫Java(二)–Servlet请求
  • 微服务框架lagom
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​人工智能书单(数学基础篇)
  • ###C语言程序设计-----C语言学习(3)#
  • #微信小程序:微信小程序常见的配置传旨
  • (2020)Java后端开发----(面试题和笔试题)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ZT)薛涌:谈贫说富
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (十八)SpringBoot之发送QQ邮件
  • (十一)手动添加用户和文件的特殊权限
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Standard 的管理策略
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET处理HTTP请求
  • .Net接口调试与案例
  • /bin/rm: 参数列表过长"的解决办法
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @vue/cli脚手架
  • [.net] 如何在mail的加入正文显示图片
  • [AHOI2009]中国象棋 DP,递推,组合数