安卓开发类微信界面设计
一、基础信息
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"
设置顶栏高度为50sp
,android:gravity="center"
设置文字居中显示。android:background="@color/teal_700"
设置背景颜色,颜色可以在colors.xml
中查找。
image-20210405120810705
最后查看效果:
image-20210405120849364
2.2 底栏设计
新建一个xml文件命名为bottom.xml
,然后拖入一个LinearLayout(vertical)
,再在里面拖入一个ImageView
和TextView
。设置图片高度和文字样式。
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.xml
和top.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()
中,开始事务,添加一个fragment
到FrameLayout
中,然后提交事务。
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); 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); 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); 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
绑定点击事件
| 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(); hideAll(fragmentTransaction); 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
- 在点击事件中,添加图片切换逻辑
| 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(); hideAll(fragmentTransaction); deactivateAllImage(); 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设计完成!