安卓开发类微信界面设计

安卓开发类微信界面设计

一、基础信息

1.1 环境配置

  • Android Studio 4.1.2
  • Gradle 6.5
  • JDK 12
  • Android 7.0

1.2 需求描述

需要在Android Studio中设计出类微信界面,即顶栏具有吸顶的标题,底栏具有吸底的四栏布局,且点击布局中的不同按钮在屏幕上切换不同的页面。

1.3 演示效果

0sjrk-kp8l9

二、操作步骤

2.1 顶部设计

首先设计界面的吸顶部分,新建layout XML File命名为top.xml,

image-20210405120312555

Component Tree中拖入一个horizontal LinearLayout,再拖入一个TextView填入微信。

image-20210405120403707

接下来设计样式:

image-20210405120628732

android:layout_height="50sp"设置顶栏高度为50spandroid:gravity="center"设置文字居中显示。android:background="@color/teal_700"设置背景颜色,颜色可以在colors.xml中查找。

image-20210405120810705

最后查看效果:

image-20210405120849364

2.2 底栏设计

新建一个xml文件命名为bottom.xml,然后拖入一个LinearLayout(vertical),再在里面拖入一个ImageViewTextView。设置图片高度和文字样式。

image-20210405121207861

android:layout_height="50dp"设置图片高度为50dp,android:clickable="false"防止图片被重复点击,android:gravity="center"设置文字居中显示。

image-20210405121317165

然后如法炮制在Component Tree中复制三个相同的LinearLayout

image-20210405121505694

这个时候四个LinearLayout会垂直排布,接下来设置android:layout_width="wrap_content",android:layout_height="wrap_content"让他们的宽度和高度适应内容。

image-20210405122041616
image-20210405122207646

为了使其等距排布,我们还需要在每个LinearLayout中设置android:layout_weight="1"

layout_weight的意思就是该布局所占的权重,假如有4个布局,每个都是1,那么四个布局权重相等,每个都占25%。

image-20210405122316675

效果如下:

image-20210405122424592

2.3 中间部分设计

中间部分的内容会随着底栏的不同按钮切换而改变,为了实现动态地变换,需要创建4个Fragment.

image-20210405122757755

创建Fragment后会在layout中自动生成相应的xml文件。

最后结构如下:

image-20210405122954495

2.4 整合顶栏和底栏

我们将bottom.xmltop.xml整合到layout_main.xml中。

设置bottom的android:layout_height="wrap_content"

image-20210405144537326

然后到layout_main里设置android:orientation="vertical"android:layout_height="wrap_content",不然会因为水平布局和top高度太大显示不完整。

image-20210405144618443

看看效果

image-20210405144710754

接下来把底栏放到最下面

我们在两个include中间放一个FragmentLayout,来把底栏"挤下去"。

image-20210405145027736

然后调整它的高度到合适的位置

image-20210405145053774

看看效果:

image-20210405145108402

2.5 逻辑代码

2.5.1 整合中间页面

  • MainActivity中关联所有的Fragment。通过FragmentManager事务管理器添加fragment
  • onCreate()中,开始事务,添加一个fragmentFrameLayout中,然后提交事务。
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
public class MainActivity extends AppCompatActivity {

// 事务管理器
FragmentManager fm = getSupportFragmentManager();

Fragment messageFragment = new MessageFragment();
Fragment friendFragment = new FriendFragment();
Fragment circleFragment = new CircleFragment();
Fragment meFragment = new MeFragment();

@NonNull
@Override
public FragmentManager getSupportFragmentManager() {
return super.getSupportFragmentManager();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_main);
// 开启事务、添加fragment、提交事务
fm.beginTransaction().add(R.id.content, messageFragment).commit();
}
}

效果如下:

image-20210405162659375

由于排版还有一些问题,我们再继续优化

然后我们把全部fragment添加进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_main);
// 开启事务、添加fragment、提交事务
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.content, messageFragment);
ft.add(R.id.content, friendFragment);
ft.add(R.id.content, circleFragment);
ft.add(R.id.content, meFragment);
// 隐藏所有fragment
hideAll(ft);
ft.commit();
}
private void hideAll(FragmentTransaction ft) {
ft.hide(messageFragment);
ft.hide(friendFragment);
ft.hide(circleFragment);
ft.hide(meFragment);
}

2.5.2 添加点击事件

具体的实现步骤

  • 定义LinearLayout
  • 继承View.OnClickListener接口,编写点击事件
  • LinearLayout绑定点击事件
1
2
3
4
wechat =findViewById(R.id.message);
friend = findViewById(R.id.friend);
circle = findViewById(R.id.circle);
me = findViewById(R.id.me);

继承View.OnClickListener,重写onClick()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public void onClick(View v) {
// 开启事务
FragmentTransaction fragmentTransaction = fm.beginTransaction();
// 隐藏所有的fragment
hideAll(fragmentTransaction);
// 判断点击的是哪个LinearLayout
switch (v.getId()) {
case R.id.wechat:
fragmentTransaction.show(this.messageFragment);
break;
case R.id.friend:
fragmentTransaction.show(this.friendFragment);
break;
case R.id.circle:
fragmentTransaction.show(this.circleFragment);
break;
case R.id.me:
fragmentTransaction.show(this.meFragment);
break;
}
// 提交事务
fragmentTransaction.commit();
}

最后可以通过点击切换不同页面

image-20210405162822877
image-20210405162827417

2.5.3 点击图片后显示激活状态

步骤如下:

  • 关联所有的ImageView
  • 根据 id绑定ImageView
  • 在点击事件中,添加图片切换逻辑
1
2
3
4
5
6
7
8
9
10
11
12
ImageView messageImage,friendImage,circleImage,meImage;
// 关联图片
messageImage = findViewById(R.id.wechatImg);
friendImage = findViewById(R.id.friendImg);
circleImage = findViewById(R.id.circleImg);
meImage = findViewById(R.id.meImg);

// 将所有图片设置为未激活
messageImage.setImageResource(R.drawable.wechat);
friendImage.setImageResource(R.drawable.friends);
circleImage.setImageResource(R.drawable.color_palette);
meImage.setImageResource(R.drawable.user);

优化点击监听事件

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
@Override
public void onClick(View v) {
// 开启事务
FragmentTransaction fragmentTransaction = fm.beginTransaction();
// 隐藏所有的fragment
hideAll(fragmentTransaction);
deactivateAllImage();
// 判断点击的是哪个LinearLayout
switch (v.getId()) {
case R.id.wechat:
fragmentTransaction.show(this.messageFragment);
// 将图片设置为激活
messageImage.setImageResource(R.drawable.wechat_active);
break;
case R.id.friend:
fragmentTransaction.show(this.friendFragment);
friendImage.setImageResource(R.drawable.friends_active);
break;
case R.id.circle:
fragmentTransaction.show(this.circleFragment);
circleImage.setImageResource(R.drawable.color_active);
break;
case R.id.me:
fragmentTransaction.show(this.meFragment);
meImage.setImageResource(R.drawable.user_active);
break;
}
// 提交事务
fragmentTransaction.commit();
}

至此UI设计完成!