博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义控件和试图(原生api)优酷菜单
阅读量:2397 次
发布时间:2019-05-10

本文共 4511 字,大约阅读时间需要 15 分钟。

使用android提供的api来做出去自己想要的控件显示效果。基于原生api是最低级的自定义控件和试图

实现原理:仅仅只是利用rotateAnimal绕圆心旋转来实现而已

布局是本来就先把图片做成斜的,然后按照相对布局贴上去而已。

布局处理的业务逻辑

package com.itheima.yokumenu28;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.RelativeLayout;public class MainActivity extends Activity implements OnClickListener {		private ImageView icon_menu;	private ImageView icon_home;		private RelativeLayout level1;	private RelativeLayout level2;	private RelativeLayout level3;	/**	 * 判断 第3级菜单是否显示	 * true 为显示	 */	private boolean isLevel3Show = true;	/**	 * 判断 第2级菜单是否显示	 * true 为显示	 */	private boolean isLevel2Show = true;	/**	 * 判断 第1级菜单是否显示	 * true 为显示	 */	private boolean isLevel1show = true;		@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);				icon_home = (ImageView) findViewById(R.id.icon_home);		icon_menu = (ImageView) findViewById(R.id.icon_menu);				level1 = (RelativeLayout) findViewById(R.id.level1);		level2 = (RelativeLayout) findViewById(R.id.level2);		level3 = (RelativeLayout) findViewById(R.id.level3);				icon_home.setOnClickListener(this);		icon_menu.setOnClickListener(this);			}	@Override	public void onClick(View v) {		switch (v.getId()) {		case R.id.icon_menu:	//处理 menu 图标的点击事件			// 如果第3级菜单是显示状态,那么将其隐藏			if(isLevel3Show){				//隐藏 第3级菜单				MyUtils.startAnimOut(level3);			}else{				// 如果第3级菜单是隐藏状态,那么将其显示				MyUtils.startAnimIn(level3);			}						isLevel3Show = !isLevel3Show;						break;		case R.id.icon_home:	//处理 home 图标 的点击事件			// 如果第2级菜单是显示状态,那么就隐藏,2,3级菜单			if(isLevel2Show ){				MyUtils.startAnimOut(level2);				isLevel2Show = false;								if(isLevel3Show){ // 如果此时,第3级菜单也显示,那也将其隐藏					MyUtils.startAnimOut(level3,200);					isLevel3Show = false;				}							}else{				// 如果第2级菜单是隐藏状态,那么就显示2级菜单				MyUtils.startAnimIn(level2);				isLevel2Show = true;			}						break;		}	}	/**	 * 改变第1级菜单的状态	 */	private void changeLevel1State() {		//如果第1级菜单是显示状态,那么就隐藏 1,2,3级菜单 		if(isLevel1show){			MyUtils.startAnimOut(level1);			isLevel1show = false;						if(isLevel2Show){ // 判断2级菜单是否显示				MyUtils.startAnimOut(level2,100);				isLevel2Show = false;				if(isLevel3Show){ // 判断3级菜单是否显示					MyUtils.startAnimOut(level3,200);					isLevel3Show = false;				}			}					}else{			//如果第1级菜单是隐藏状态,那么就显示 1,2级菜单 			MyUtils.startAnimIn(level1);			isLevel1show = true;						MyUtils.startAnimIn(level2,200);			isLevel2Show = true;					}			}				@Override	/**	 * 响应按键的动作	 */	public boolean onKeyDown(int keyCode, KeyEvent event) {	if(keyCode == KeyEvent.KEYCODE_MENU){ // 监听 menu 按键		changeLevel1State();	}		return super.onKeyDown(keyCode, event);	}	}
工具类:就是利用
RotateAnimation
类来旋转图标而已

package com.itheima.yokumenu28;import android.view.animation.RotateAnimation;import android.widget.RelativeLayout;public class MyUtils {	/**	 * 让指定的view 执行 旋转离开的动画	 * @param view	 */	public static void startAnimOut(RelativeLayout view) {				startAnimOut(view, 0);	}	/**	 * 让指定view 延时 执行旋转离开的动画,	 * @param level3	 * @param offset	延时的时间	 */	public static void startAnimOut(RelativeLayout view, long offset) {		/*		 * 默认圆为 为view的左上角,		 * 水平向右 为 0度		 * 顺时针旋转度数增加		 */		RotateAnimation animation  =new RotateAnimation(0, 180, view.getWidth()/2, view.getHeight());		animation.setDuration(500);	//	设置运行的时间		animation.setFillAfter(true);	//动画执行完以后,保持最后的状态,否则 动画执行完之后就回复原状了		animation.setStartOffset(offset);	// 设置延时执行的时间				view.startAnimation(animation);			}				/**	 * 让指定的view 执行 旋转进入的动画	 * @param view	 */	public static void startAnimIn(RelativeLayout view) {				startAnimIn(view, 0);	}	/**	 * 让指定的view 延时执行 旋转进入的动画	 * @param level2	 * @param i	延时的时间	 */	public static void startAnimIn(RelativeLayout view, int i) {		/*		 * 默认圆为 为view的左上角,		 * 水平向右 为 0度		 * 顺时针旋转度数增加		 */		RotateAnimation animation  =new RotateAnimation(180, 360, view.getWidth()/2, view.getHeight());		animation.setDuration(500);	//	设置运行的时间		animation.setFillAfter(true);	//动画执行完以后,保持最后的状态,否则 动画执行完之后就回复原状了		animation.setStartOffset(i);	//设置延时执行的时间		view.startAnimation(animation);					}}

转载于:https://my.oschina.net/u/2356176/blog/422187

你可能感兴趣的文章
深入理解RPC——RPC在企业服务中的核心价值
查看>>
跋山涉水 —— 深入 Redis 字典遍历
查看>>
如何解决Java线程池队列过饱问题
查看>>
Lettuce快速入门
查看>>
轻量级框架Spark快速入门
查看>>
蚂蚁金服RPC框架结构分析
查看>>
eclipse踩坑Order and Export引发java.lang.NoClassDefFoundErrorFailed resolution of
查看>>
Video Telephony笔记
查看>>
SMTP验证
查看>>
POP/IMAP-before-SMTP
查看>>
Eclipse 快捷键
查看>>
怎样在同一终端上多帐号登陆同一服务器?
查看>>
BiteFight 简单外挂开发之IE篇
查看>>
SVN常用命令学习笔记
查看>>
Avoiding memory leaks
查看>>
AT Command for QOS
查看>>
中文字号VS英文字号(磅)VS像素值的对应关系
查看>>
关于@override报错的问题
查看>>
Linux中禁止Ctrl-Alt-Delete
查看>>
概念辨析:dBm, dBi, dBd, dB, dBc, dBuV
查看>>