Android Studio之仿微信APP界面设计
文章目录
- 一、功能需求
- 二、页面布局设置
- 1. 顶部top.xml布局
- 2. 底部bottom.xml布局
- 3. 中间页面设置
- 4. activity_main.xml
- 5. 资源控制drawable文件
- 三、页面跳转控制(java文件)
- 1. MainActivity
- 2. 其他Java文件
- 四、运行界面展示
- 五、源码
一、功能需求
完成一个类似微信页面的布局,要求:
- 页面最上方是标题居中
- 页面中间界面显示内容,内容随下方栏的选择而切换
- 页面最下方有四个按钮
- 点击按钮后,按钮图标会变换颜色,且显示框变换内容
二、页面布局设置
1. 顶部top.xml布局
创建layout文件top.xml中,添加文本框,添加文字,设置为居中,修改文字颜色和LinearLayout背景颜色。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="vertical"android:gravity="center"android:layout_height="50dp"android:background="#0E0D0D"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center_horizontal"android:text="我的微信"android:textColor="@color/white"android:textSize="25sp" />
</LinearLayout>
效果如下:
2. 底部bottom.xml布局
新建layout布局文件button.xml。
先添加一个LinearLayout(vertical),修改LinearLayout大小和颜色:修改gravity所对应的配置信息为center,再修改大小,添加id。
在刚刚添加的LinearLayout(vertical)下添加ImageButton,选择要放入的图片
在这里插入代码片<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="60dp"android:background="@color/colorViewNormal"android:gravity="center"><LinearLayoutandroid:id="@+id/chat"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"app:srcCompat="@drawable/chat2" /></LinearLayout><LinearLayoutandroid:id="@+id/contacts"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView2"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"app:srcCompat="@drawable/contracts2" /></LinearLayout><LinearLayoutandroid:id="@+id/circle_friend"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView3"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"app:srcCompat="@drawable/circleoffriend2" /></LinearLayout><LinearLayoutandroid:id="@+id/settings"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"app:srcCompat="@drawable/setting1" /></LinearLayout>
</LinearLayout>
复制三个修改好的LinearLayout,修改ImageButton的资源路径,分别修改LinearLayout、ImageView的id。
效果如下:
3. 中间页面设置
新建四个layout.xml文件,分别添加一个ImageView,修改文字内容,并将ImageView设置居中
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".chat"><ImageViewandroid:id="@+id/imageView6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/chat"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
ps:这里可能会出现“Missing Constraints in ConstraintLayout”的报错
解决方案是:拖拽界面中按钮四周的圆点,到你想要设置的相对距离
4. activity_main.xml
我们想要的效果是页面最上方是标题,中间显示文本,最下方有四个按钮,故在activity_main.xml中先添加一个LinearLayout
在LinearLayout中按顺序添加三个部分:
通过include标签添加top.xml和button.xml
由于四个显示文本的页面都是在中间,故选择通过放一个FrameLayout在top和button的中间
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.mydemo.MainActivity"><include layout="@layout/top"></include><FrameLayoutandroid:id="@+id/frame_content"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:id="@+id/imageView9"android:layout_width="wrap_content"android:layout_height="wrap_content"app:srcCompat="@drawable/setting" /></FrameLayout><include layout="@layout/bottom"></include></LinearLayout>
5. 资源控制drawable文件
在使用之前先将图片文件导入到/res/drawable中,可以直接将windows本地文件拖拽至目标文件夹中
三、页面跳转控制(java文件)
1. MainActivity
先为fragment类创建实例对象
定义一个FragmentManager来控制Fragment
//FragmentManagerprivate FragmentManager fragmentManager;
再写一个初始化Fragment的函数,将四个fragment放到FrameLayout中
//初始化中间的部分的图层片段private void initFragment(){fragmentManager=getSupportFragmentManager();FragmentTransaction transaction=fragmentManager.beginTransaction();transaction.add(R.id.frame_content, Fragment_chat);transaction.add(R.id.frame_content, Fragment_contacts);transaction.add(R.id.frame_content, Fragment_circleoffriend);transaction.add(R.id.frame_content, Fragment_setting);//提交事务transaction.commit();}
我们需要实现的是,点击按钮,按钮会变色,并且跳转到相应的页面。所以我们需要对ImageButton所属的LinearLayout来进行监听,但是ImageButton和LinearLayout都属于布局文件中的一部分,我们不能直接调用,所以需要创建一个函数initView()来实现对ImageButton和LinearLayout控件实例化,方便我们后续调用
为实现点击按钮之后可以跳转到相应的页面,我们可以先隐藏四个界面,在点击button后再显示出选择的页面。可以选择自定义一个**HideFragment()**函数,调用hide()函数隐藏四个界面。
为实现点击按钮后变色,我们可以定义一个Fragment_select()函数来实现:传入一个参数,通过调用transaction的show()函数,展示对应的页面。
为实现点击按钮跳转页面,我们需要对进行监听。在最开头的MainActivity后添加implements View.OnClickListener,函数具体作用代码中有注释:
package com.example.mydemo;import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;public class MainActivity extends AppCompatActivity implements View.OnClickListener{//Fragmentprivate Fragment Fragment_chat =new chat();private Fragment Fragment_contacts =new contacts();private Fragment Fragment_circleoffriend =new circleoffriend();private Fragment Fragment_setting =new setting();//底端菜单栏LinearLayoutprivate LinearLayout linear_chat;private LinearLayout linear_contacts;private LinearLayout linear_ciecleoffriend;private LinearLayout linear_setting;//底端菜单栏中的Imageviewprivate ImageView imageView_chat;private ImageView imageView_contacts;private ImageView imageView_circleoffriend;private ImageView imageView_setting;//FragmentManagerprivate FragmentManager fragmentManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE );setContentView(R.layout.activity_main);initView();initFragment();initEvent();Fragment_select(0);//将第一个图标设为选中状态imageView_chat.setImageResource(R.drawable.chat);imageView_chat.setImageResource(R.drawable.chat1);}//监听函数,监听到底是哪一个图标被击中从而显示哪一个界面的内容@Overridepublic void onClick(View view) {//每次点击之后,将所有的ImageView和TextView设置为未选中restartButton();switch(view.getId()){case R.id.chat://选择所点击的菜单对应的图层片段Fragment_select(0);//将该菜单的点击状态置为点击态imageView_chat.setImageResource(R.drawable.chat);imageView_chat.setImageResource(R.drawable.chat1);break;case R.id.contacts:Fragment_select(1);imageView_contacts.setImageResource(R.drawable.contracts);imageView_contacts.setImageResource(R.drawable.contracts1);break;case R.id.circle_friend:Fragment_select(2);imageView_circleoffriend.setImageResource(R.drawable.circleoffirend);imageView_circleoffriend.setImageResource(R.drawable.circleoffriend1);break;case R.id.settings:Fragment_select(3);imageView_setting.setImageResource(R.drawable.setting);imageView_setting.setImageResource(R.drawable.setting1);break;default:break;}}//重置菜单的点击状态,设为未点击private void restartButton() {//设置为未点击状态imageView_chat.setImageResource(R.drawable.chat);imageView_chat.setImageResource(R.drawable.chat1);imageView_contacts.setImageResource(R.drawable.contracts);imageView_contacts.setImageResource(R.drawable.contracts1);imageView_circleoffriend.setImageResource(R.drawable.circleoffirend);imageView_circleoffriend.setImageResource(R.drawable.circleoffriend1);imageView_setting.setImageResource(R.drawable.setting);imageView_setting.setImageResource(R.drawable.setting1);}//初始化中间的部分的图层片段private void initFragment(){fragmentManager=getSupportFragmentManager();FragmentTransaction transaction=fragmentManager.beginTransaction();transaction.add(R.id.frame_content, Fragment_chat);transaction.add(R.id.frame_content, Fragment_contacts);transaction.add(R.id.frame_content, Fragment_circleoffriend);transaction.add(R.id.frame_content, Fragment_setting);//提交事务transaction.commit();}//初始化各底端的LinearLayout、ImageView和TextView组件private void initView(){//改变图标颜色linear_chat =findViewById(R.id.chat);linear_contacts =findViewById(R.id.contacts);linear_ciecleoffriend =findViewById(R.id.circle_friend);linear_setting =findViewById(R.id.settings);imageView_chat =findViewById(R.id.imageView1);imageView_contacts =findViewById(R.id.imageView2);imageView_circleoffriend =findViewById(R.id.imageView3);imageView_setting =findViewById(R.id.imageView4);}//初始化点击监听事件private void initEvent(){linear_chat.setOnClickListener(this);linear_contacts.setOnClickListener(this);linear_ciecleoffriend.setOnClickListener(this);linear_setting.setOnClickListener(this);}//把没有使用的界面的内容隐藏private void hideView(FragmentTransaction transaction){transaction.hide(Fragment_chat);transaction.hide(Fragment_contacts);transaction.hide(Fragment_circleoffriend);transaction.hide(Fragment_setting);}//显示选中界面的内容,选中界面图标为绿色private void Fragment_select(int i){FragmentTransaction transaction=fragmentManager.beginTransaction();//调用隐藏所有图层函数hideView(transaction);switch (i){case 0:transaction.show(Fragment_chat);break;case 1:transaction.show(Fragment_contacts);break;case 2:transaction.show(Fragment_circleoffriend);break;case 3:transaction.show(Fragment_setting);break;default:break;}//提交转换事务transaction.commit();}
}
2. 其他Java文件
这里因为有四个页面,分别是聊天、联系人、朋友圈、我,对应着chat.java、contacts.java、circleoffriend.java、setting.java文件。
四、运行界面展示
结果展示我只选了两个界面进行展示
中间的内容,我并没选择使用文本框,而是自己实际微信界面的截图,这样显得更加真实。
ps:这里运行后出现了“Emulator: handleCpuAcceleration: feature check for hvf”问题
解决办法:修改配置文件
五、源码
自己之前已有GitHub的账号,所以就直接将代码上传了。
ssh-keygen -t rsa -C "我的邮箱"生成密钥
出现了“invalid authentication data. 404 Not Found-Not Found”问题,这里应选择利用token连接
详细代码已上传至代码仓库
Android Studio之仿微信APP界面设计相关推荐
- [Android] Android 手机下 仿 微信 客户端 界面 -- 微聊
Android 手机下 仿 微信 客户端 界面 -- 微聊 (包括聊天列表 + 聊天对话页 + 朋友圈列表页 + 我的/发现 列表页) 项目演示: 功能说明: 1)底部标签切换 (TabHost + ...
- Android studio实现仿微信界面
一.静态界面实现(.xml) 功能需求 1.上方有标题(居中) 2.中间显示内容,内容随着下方控件而切换. 3.下方四个控件可切换. 实现页面展示: 共三大部分,顶部和底部一直不变,中间部分随着点击切 ...
- uniapp+nvue实现仿微信App界面+功能 —— uni-app实现聊天+语音+视频+图片消息
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...
- android ui头像圆角化,APP界面设计当中,为什么喜欢把头像设计成圆形
看到这样的标题,你是不是也很惊奇呢?仔细的去回想一下,好像很多APP界面设计当中的头像都是圆形的.很少见到头像是方形的.菱形或者四边形的. 这是为什么呢? 难道是因为好看吗? 今天25学堂的小编跟大家 ...
- dart 获取手机信息_flutter+dart仿微信App界面聊天实例
Flutter 是 谷歌 开源的 UI 框架,旨在帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台.相比较目前的混合开发方案,Flutter 提供了大量的文档,能非常 ...
- vue整合uniapp_uni-app仿微信App界面|vue+uniapp聊天室|仿微信朋友圈
项目简介 基于uni-app+vue+vuex+uniPop+swiper等技术开发的仿微信聊天室uniapp-chatroom项目,类似vue及小程序api语法使开发更加方便,实现了发送图文消息.表 ...
- Android jquery mobile 仿微信主界面
效果图: 地址:http://pan.baidu.com/s/1eSupF6E 总结:只要熟悉Jquery,很快就能上手,界面效果和原生的还是有些区别,做简单的页面还是可以的. page_ ...
- Android Studio校园二手交易市场app
[安卓大作业]Android Studio校园二手交易市场app 界面展示 主要功能 1.登陆注册用户,若忘记密码可通过邮箱找回密码: 2.商品分类展示,可在首页购买商品: 3.商品详情页可留言.收藏 ...
- Android studio心得——用fragment仿微信APP
前言 今天我想与大家分享一些关于如何利用fragment实现仿微信APP的经验.作为社交领域最受欢迎.功能齐全且可扩展性强的应用之一,微信APP在浏览器首页和个人中心之上还有一个重要部分:底部导航栏. ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
最新文章
- python从入门到精通视频-python从入门到精通视频(大全60集)
- 怎么分辨学校计算机sql版本,怎么筛选出每个年级每个学校有多少个班级
- 人类长非编码RNA表达数据库,整合9种重要生物学场景(发育、癌症、病毒侵染等)...
- ubuntu之Matlab安装
- Spring实战——无需一行xml配置实现自动化注入
- 文件带 BOM 的看法
- 《遗传算法原理及应用》笔记—绪论
- 红外遥控器-VS1838B/HS0038红外接收方案(包含原理图+PCB+BOM表+程序)
- BCM94360Z4刷蓝牙固件魔改, Mac真正免驱无线网卡,实现原装网卡一样完美黑苹果,啊哈哈
- python arp断网攻击_arp断网攻击,手把手教你arp断网攻击怎么解决
- 小程序如何cdn加速服务器,小程序能用cdn加速吗
- 示波器探头需要补偿校准的根本原因
- 新手村 - 第四站,认识成交量
- java初步编程教程,2022最新
- 使用树莓派定时给微信群发消息
- 【软考——系统架构师】信息系统基础
- 某奇迹私服 S18 客户端木马逆向分析
- Android Studio之菜单栏制作
- 官宣:今晚下班先别走
- 推荐系统常用评价指标
热门文章
- 怎么看两张图片的相似度,测试两张照片相似度
- [HLSL]HLSL 入门参考 (dx11龙书附录B译文)
- 卡西欧计算机设置参数,【卡西欧 fx-991CN X 中文函数计算器使用总结】参数|功能|显示|计算_摘要频道_什么值得买...
- 使用MindSpore进行一阶导数计算
- 群晖Docker部署Alist V2
- 360路由器虚拟服务器怎么设置,路由器端口映射设置步骤
- 摘抄整理:基于数据驱动的故障诊断方法综述
- vim方向键、退格键失效,insert模式异常修复方法
- 网络是怎样连接的?从浏览器输入URL开始
- 揭秘工业互联网的内涵、热点与难点!