安卓环形菜单(处理了菜单键和返回键+加入了动画)

废话不多说,先看效果图:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:id="@+id/level1"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level1" >

        <ImageView
            android:id="@+id/icon_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@drawable/icon_home" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/level2"
        android:layout_width="180dp"
        android:layout_height="90dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level2" >

        <ImageView
            android:id="@+id/icon_search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/icon_search" />

        <ImageView
            android:id="@+id/icon_menu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:background="@drawable/icon_menu" />

        <ImageView
            android:id="@+id/icon_myyouku"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/icon_myyouku" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/level3"
        android:layout_width="280dp"
        android:layout_height="140dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level3" >

        <ImageView
            android:id="@+id/channel1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/channel1" />

        <ImageView
            android:id="@+id/channel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/channel1"
            android:layout_alignLeft="@id/channel1"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="20dp"
            android:background="@drawable/channel2" />

        <ImageView
            android:id="@+id/channel3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/channel2"
            android:layout_alignLeft="@id/channel2"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="30dp"
            android:background="@drawable/channel3" />

        <ImageView
            android:id="@+id/channel4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:background="@drawable/channel4" />

        <ImageView
            android:id="@+id/channel7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/channel7" />

        <ImageView
            android:id="@+id/channel6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/channel7"
            android:layout_alignRight="@id/channel7"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="20dp"
            android:background="@drawable/channel6" />

        <ImageView
            android:id="@+id/channel5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/channel6"
            android:layout_alignRight="@id/channel6"
            android:layout_marginBottom="5dp"
            android:layout_marginRight="30dp"
            android:background="@drawable/channel5" />
    </RelativeLayout>

</RelativeLayout>
package com.example.circlemenuofbottom.anim;

import android.view.animation.RotateAnimation;
import android.widget.RelativeLayout;

/**
 * @author lzd
 *
 * QQ : 2622596982
 *
 * email : [email protected]
 *
 * QQ 交流群 :277599214
 */
public class MyAnimationUtils {

	/**
	 * 出去的动画---顺时针出
	 *
	 * @param view
	 *            执行动画的对象
	 */
	public static void animaOut(RelativeLayout view) {
		/*
		 * RotateAnimation animation = new RotateAnimation(0, 180,
		 * view.getWidth() / 2, view.getHeight()); animation.setDuration(500);
		 * animation.setFillAfter(true); view.startAnimation(animation);
		 */
		animaOut(view, 0);
	}

	/**
	 * 出去的动画---逆时针进
	 *
	 * @param view
	 *            执行动画的对象
	 */
	public static void animaIn(RelativeLayout view) {
		/*
		 * // 顺时针进 // RotateAnimation animation = new RotateAnimation(180, //
		 * 360,view.getWidth() / 2, view.getHeight()); // 逆时针进 RotateAnimation
		 * animation = new RotateAnimation(-180, -360, view.getWidth() /
		 * 2,view.getHeight()); animation.setDuration(500);
		 * animation.setFillAfter(true); view.startAnimation(animation);
		 */
		animaIn(view, 0);
	}

	/**
	 * 出去的动画---顺时针出
	 *
	 * @param view
	 *            执行动画的对象
	 * @param offSetTime
	 *            延时执行的时间
	 */
	public static void animaOut(RelativeLayout view, int offSetTime) {

		RotateAnimation animation = new RotateAnimation(0, 180,
				view.getWidth() / 2, view.getHeight());
		animation.setDuration(500);
		animation.setStartOffset(offSetTime);
		animation.setFillAfter(true);
		view.startAnimation(animation);
	}

	public static void animaIn(RelativeLayout view, int offSetTime) {

		// 顺时针进
		// RotateAnimation animation = new RotateAnimation(180,
		// 360,view.getWidth() / 2, view.getHeight());
		// 逆时针进
		RotateAnimation animation = new RotateAnimation(-180, -360,
				view.getWidth() / 2, view.getHeight());
		animation.setDuration(500);
		animation.setStartOffset(offSetTime);
		animation.setFillAfter(true);
		view.startAnimation(animation);
	}

}

按键的处理思路:

/*
	 * 监听菜单键,当用户点击菜单键的时候,显示和隐藏一级和二级菜单
	 *
	 * 监听返回键,再按一次退出程序
	 */
	private long exitTime = 0;
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 菜单键的处理
		if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_MENU){
			// 如果 一级菜单显示,隐藏 全部
			if(isShowLevel1){
				MyAnimationUtils.animaOut(level);
				isShowLevel1 = false;
				if(isShowLevel2){
					MyAnimationUtils.animaOut(level2,120);
					isShowLevel2 = false;
					if(isShowLevel3){
						MyAnimationUtils.animaOut(level3,120);
						isShowLevel3 = false;
					}
				}
			}else{
				// 如果一级菜单式隐藏的,显示 一,二级菜单
				MyAnimationUtils.animaIn(level);
				MyAnimationUtils.animaIn(level2, 120);
				isShowLevel1 = true;
				isShowLevel2 = true;
			}
		}
		// 返回键
		if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK){
			if(System.currentTimeMillis() - exitTime > 2000){
				Toast.makeText(this, "再按一次返回键退出", Toast.LENGTH_SHORT).show();
				exitTime = System.currentTimeMillis();
			}else{
				finish();
				System.exit(0);
			}
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

没有什么可以好说的,仔细看看就全懂了,若还有疑问,请联系我 或者 到群里交流。

最后附上下载地址 : http://download.csdn.net/detail/escdelete/8340545

时间: 2024-10-21 08:56:05

安卓环形菜单(处理了菜单键和返回键+加入了动画)的相关文章

【Android】各式各样的弹出框与对菜单键、返回键的监听

Android自带各式各样的弹出框,弹出框也是安卓基本的组件之一.同时安卓程序可以对菜单键.返回键的监听,但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键,如果非要对Home键的屏蔽与监听,就会出现java.lang.IllegalArgumentException: Window type can not be changed after the window is added.的错误. 下面写一个小程序,来说明Android各式各样的弹出框,同时,安卓是如何对菜单键.

Cocos2d-x3.0 捕捉Android的菜单键和返回键

原文地址:http://blog.csdn.net/qqmcy/article/details/26172665 .h void onKeyReleased(EventKeyboard::KeyCode keycode, Event* event); .cpp   注册返回键监听 // // PrograssScene.cpp // SJKB // // Created by 杜甲 on 14-5-5. // // #include "PrograssScene.h" #include

Android 菜单键和返回键互换

打开RE管理器找到system/usr/keylayout/ 长按qwerty.kl选择以文本编辑器查看 将里面的MENU和BACK全部替换掉 保存,退出管理器,重启手机,菜单键和返回键的位置就调换过来了 互换方式非常简单,只用将两个数字调换,但需要一些动手能力. 1,首先机器必须ROOT.2,手机安装RE文件管理器.3,通过RE文件管理器找到/system/usr/keylayout目录,其中的generic.kl和qwerty.kl就是需要我们修改的两个文件,建议修改前先将这2个文件备份.4

Android重写菜单增加系统自带返回键

条件:当前项目导入了ActionBarSherlock这个jar包,这个jar包的作用为了程序的兼容性,考虑低版本的问题. 学习ActionBarSherlock参考博客链接:http://blog.csdn.net/icyfox_bupt/article/details/9286387 接下来贴上代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

[android] 优酷环形菜单-相对布局练习

优酷环形菜单 布局文件,使用<RelativeLayout/>控件作为第一级菜单,相对布局,位于父控件的底部,水平居中,因为图片不是特别的标准,因此宽度和高度都钉死,宽度是高度的两倍 二次菜单和三级菜单都一样的布局 小房子的图标<imageView/>控件,在父控件中居中 第二级搜索图标,位于父控件的底部,上下左右maigin10dp 第二级菜单图标,位于父控件的顶部,水平居中,marginTop 10dp 第二级叹号图标,位于父控件的底部,右边,margin 10dp 第三级的图

Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键

在Android系统中用来显示界面的组件(Component)为Activity,也就是说只有重写Activity的onKeyDown方法来监控/拦截/屏蔽系统的返回键(back).菜单键(Menu)及Home键. 1.拦截/屏蔽返回键.菜单键实现代码 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_BACK) { //监控/拦截/屏蔽返回键   

React Native组件之BackAndroid !安卓手机的物理返回键的使用

ok!在安卓手机上,当我们用物理返回键的时候,会以一次性的将程序退出来,这样是很不好的体验,所以就需要使用RN的物理返回键组件:BackAndroid,其原理也就是 分析路由,然后pop()这样! ok!先来说下路由栈吧!,有一点计算机技术基础的同学都应该学过堆栈,其中的栈就是后入先出,也就是RN里面的push(入栈),pop(出栈)! 好的!如图所示! 1:两个路由之间的backandroid else return 直接退出应用 2:在注册组件设置backAndroid(这里注意了,在注册组

适合移动手机使用的js环形菜单特效插件

blooming-menu是一款适合在移动手机上使用的js环形菜单插件.该环形菜单提供了众多的參数,通过结合CSS3动画制作出效果很炫酷的圆形菜单展开和隐藏动画效果. 以下是这个圆形菜单菜价的可用參数: opts.itemsNum:类型:Number,该參数为必填參数. 该參数是菜单项的数量. opts.startAngle:类型:Number.默认值90.菜单的開始角度. opts.endAngle:类型:Number.默认值0.菜单的结束角度. opts.radius:类型:Number.默

jQuery Wheel 环形菜单插件5种效果演示

很酷的菜单-jQuery Wheel 环形菜单插件5种效果演示 在线预览 下载地址 实例代码 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 31 32 33 34 35 <div class="container">            <!-- Top Navi -->            <div class="header