心得感悟
这个Demo相对来说较简单,还有几个小Demo就不写上来了。最近上课都是在练有关动画的Demo,写多了后的确利于理解记忆新的知识点,毕竟Android开发没有像C语音、Java那样有理论知识储备,眼熟全靠多练。
内容简概
- 一、需求分析
- 二、添加素材图片
- 三、创建旋转xml文件
- 四、新建xml文件配置输入框
- 五、MainActivity中实现动画
- 六、图片素材及源代码
- 七、最终效果图
一、需求分析
1. 实现效果预览
这个半圆菜单共有三层,最终效果图请滑到底部查看。
①菜单关闭时
:点击第一层的菜单键可展开第二层菜单,点击第二层菜单键可展开第三层菜单
②菜单展开时
:点击第一层菜单键可收回第二、三层菜单,点击第二层菜单键可收回第三层菜单
要求:第二、三层菜单同时收回时,第二层菜单有延迟效果
二、添加素材图片
素材有3个半圆菜单层和11个小图标,因为图标在菜单层中,故采用三个RelativeLayout
分别添加3个菜单层,再用11个ImageButton
添加小图标。
- 第一层菜单的代码如下(二、三层与此类似):
<RelativeLayout
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/level1"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
<ImageButton
android:id="@+id/ib_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_home"
android:background="@null"
android:layout_centerInParent="true"/>
</RelativeLayout>
三、创建旋转xml文件
在Project
中的res
里新建一个anim
文件夹,在anim
文件夹中创建两个xml文件管理旋转动画。
- rotate_in_anim(转入)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" android:duration="1000">
<rotate android:fromDegrees="180"
android:toDegrees="0"
android:pivotX="50%"
android:pivotY="100%"/>
</set>
- rotate_out_anim(转出)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" android:duration="1000">
<rotate android:fromDegrees="0"
android:toDegrees="-180"
android:pivotX="50%"
android:pivotY="100%"/>
</set>
五、MainActivity中实现动画
1. 在onCreate
方法中加载容器布局,添加菜单和点击事件。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 加载容器布局
level3 = findViewById(R.id.rl_level3);
level2 = findViewById(R.id.rl_level2);
// menu
ImageButton menu = findViewById(R.id.ib_menu);
ImageButton home = findViewById(R.id.ib_home);
// 添加点击事件
menu.setOnClickListener(this);
home.setOnClickListener(this);
}
2. 在onClick
方法中管理菜单的点击事件
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.ib_menu:
if (isLevel3Open){
// 关闭
}else {
// 打开
}
// 改变状态
isLevel3Open = !isLevel3Open;
break;
case R.id.ib_home:
if (isLevel3Open){
// 关闭第三层菜单
isLevel3Open = false;
}
if (isLevel2Open){
// 关闭第二层菜单
}else {
// 打开第二层菜单
}
isLevel2Open = !isLevel2Open;
break;
default:
break;
}
}
3. 添加open
方法和close
方法管理菜单的开启/关闭
public void open(RelativeLayout rl){
Animation in = AnimationUtils.loadAnimation(this,R.anim.rotate_in_anim);
rl.startAnimation(in);
// 子控件可以点击
changeState(rl,true);
}
public void close(RelativeLayout rl,long delay){
Animation out = AnimationUtils.loadAnimation(this,R.anim.rotate_out_anim);
out.setStartOffset(delay);
rl.startAnimation(out);
// 子控件不可点击
changeState(rl,false);
}
4. 添加changeState
方法使关闭菜单后按钮不可用
由于我们使用的
是补间动画而不是属性动画
,我们看到的菜单收回仅仅是表象,实际上它的“灵魂”还在原处。
也就是说,当第二、三菜单均被收回,点击空白处第二层菜单的菜单键的位置,第三层菜单仍会被打开。因此,我们需要写一个方法使菜单收回时上面的按钮无效。
public void changeState(RelativeLayout rl,boolean enabled){
// 获取子控件个数
int childCount = rl.getChildCount();
// 遍历容器的子控件
for (int i = 0; i < childCount; i++) {
// 取出对应子控件
View v = rl.getChildAt(i);
v.setEnabled(enabled);
}
}
六、图片素材及源代码
文件如下 |
---|
图片素材及源代码 |
点赞文章+回复“1”领取提取码 |
七、最终效果图
最后分享一篇关于动画的文章给大家~
Android 安卓动画 属性动画
网友评论