效果图:

制作思路:

1、先分析这个效果,事实上能够理解为把三级菜单分成level1,level2,level3,level1是始终显示的。

点击level1后,level2会出现;点击level2后,level3会出现;level2,level3出现后,点击level1,level2和level3都会消失。

然后消失和出现我们用到了一个动画效果。

2、动画效果用到的是RotateAnimation。因为我们都是用同一个效果,那么我们仅仅要写一个类,把效果实现了就能够了。要是使用RotateAnimation的话。我们会不断的复用一些代码,这样开发的效率会比較低。

3、RotateAnimation的旋转进入和旋转出去是个坑——由于他是在X轴顺时针方向旋转的。大家能够看看图:

总体思路就是这样,接下来就是一些操作了:

代码:

1、MyAnimation类:

public class MyAnimation{
public static void animationIn(View view){
animationIn(view,0);
} public static void animationOut(View view){
animationOut(view,0);
} public static void animationIn(View view,long delay){
RotateAnimation animation = new RotateAnimation(180, 360, view.getWidth()/2, view.getHeight());
animation.setDuration(500);
animation.setFillAfter(true);
animation.setStartOffset(delay); view.startAnimation(animation);
} public static void animationOut(View view,long delay){
RotateAnimation animation = new RotateAnimation(0, 180, view.getWidth()/2, view.getHeight());
animation.setDuration(500);
animation.setFillAfter(true);
animation.setStartOffset(delay); view.startAnimation(animation);
}
}

2、MainActivity类:

public class MainActivity extends Activity implements OnClickListener{
private boolean isLevel2showed,isLevel3showed; private RelativeLayout level1,level2,level3;
private ImageButton home,menu; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); isLevel2showed = false;
isLevel3showed = false;
initLayout();
initImageButton();
} public void initLayout() {
level1 = (RelativeLayout)findViewById(R.id.relate_level1);
level2 = (RelativeLayout)findViewById(R.id.relate_level2);
level3 = (RelativeLayout)findViewById(R.id.relate_level3); level2.setVisibility(View.INVISIBLE);
level3.setVisibility(View.INVISIBLE);
} public void initImageButton() {
home = (ImageButton)level1.findViewById(R.id.home);
menu = (ImageButton)level2.findViewById(R.id.menu); home.setOnClickListener(this);
menu.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch(v.getId()){
case R.id.home:
if(!isLevel2showed){
isLevel2showed = true;
MyAnimation.animationIn(level2);
}else if(!isLevel3showed){
isLevel2showed = false;
MyAnimation.animationOut(level2);
}else{
isLevel2showed = false;
isLevel3showed = false;
MyAnimation.animationOut(level3);
MyAnimation.animationOut(level2,500);
} break;
case R.id.menu:
if(!isLevel3showed){
isLevel3showed = true;
MyAnimation.animationIn(level3);
}else{
isLevel3showed = false;
MyAnimation.animationOut(level3);
}
break;
}
}
}



源代码下载

Android自己定义控件:老版优酷的三级菜单(效果图 + Demo)的更多相关文章

  1. Android自己定义控件系列一:Android怎样实现老版优酷client三级环形菜单

    转载请附上本文链接:http://blog.csdn.net/cyp331203/article/details/40423727 先来看看效果: 一眼看上去好像还挺炫的,感觉比較复杂...实际上并不 ...

  2. Android自己定义控件:进度条的四种实现方式

    前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...

  3. Android自己定义控件系列五:自己定义绚丽水波纹效果

    尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...

  4. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  5. Android自己定义控件皮肤

    Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有 ...

  6. android 自己定义控件属性(TypedArray以及attrs解释)

    近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...

  7. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  8. Android自己定义控件(状态提示图表)

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...

  9. Android自己定义控件系列二:自己定义开关button(一)

    这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样.拿系统的控件来实现.计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性: 以下就 ...

随机推荐

  1. Websense一面、二面及Offer

    1.  写脚本打印当前目录(子目录)下文件内容中包含abc字符串文件 2.  用C写一个管道通信的程序:父进程向子进程写一个”hello word”字符串,子进程输出. 3.  解释I-node. 4 ...

  2. javascript笔记整理(数据类型强制/隐式转换 )

    A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...

  3. React.js学习

    React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...

  4. Flash, Flex, Air, Flashplayer之间的相互关系是什么?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:曾嵘链接:http://www.zhihu.com/question/20001256/answer/15565376来源:知 ...

  5. NProxy——Mac和Linux平台下的Fiddler

    Fiddler 相信大家,尤其是前端工程师们都知道. 用它的文件替换功能,将线上的静态资源文件(JS.CSS.图片)替换为本地相应的文件,来调试线上(代码都被压缩过)UI的问题.的确是一神器.(相比, ...

  6. 【Unity技巧】使用单例模式Singleton

    这几天想把在实习里碰到的一些好的技巧写在这里,也算是对实习的一个总结.好啦,今天要讲的是在Unity里应用一种非常有名的设计模式——单例模式. 开场白 单例模式的简单介绍请看前面的链接,当然网上还有很 ...

  7. mysql学习之中的一个:mysql安装

    我用的时mac系统,本来想在mac系统上装一个,可是发现mac系统始终无法用password登入到本机server,很奇怪的问题(在stackflow上看了些回复,也没有找到原因),最后仅仅好装到虚拟 ...

  8. QString与char*的相互转换

    原地址:http://blog.sina.com.cn/s/blog_5c70dfc80100r0nh.html 一.QString转char*   QString str; int num=0; s ...

  9. [置顶] js中如何复制一个对象,如何获取所有属性和属性对应的值

    在js中如何复制一个对象,例如如下一个js对象. 如果知道这个对象的所有属性自然就可以重新new一个,然后对每个属性赋值,就可以做到,但如果不知道呢?如何创建一个内容相同 的对象呢? var obj= ...

  10. Minor GC、Major GC和Full GC之间的区别(转)

    在 Plumbr 从事 GC 暂停检测相关功能的工作时,我被迫用自己的方式,通过大量文章.书籍和演讲来介绍我所做的工作.在整个过程中,经常对 Minor.Major.和 Full GC 事件的使用感到 ...