Android编程实现仿优酷旋转菜单效果(附demo源码)

本文实例讲述了Android编程实现仿优酷旋转菜单效果。分享给大家供大家参考,具体如下:

首先,看下效果:

不好意思,不会制作动态图片,只好上传静态的了,如果谁会,请教教我吧。

首先,看下xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#c9c9c9" >
  <RelativeLayout
    android:id="@+id/relate_level3"
    android:layout_width="280dp"
    android:layout_height="140dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/level3" >
    <ImageButton
     android:id="@+id/c1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:layout_marginBottom="6dip"
     android:layout_marginLeft="12dip"
     android:background="@drawable/channel1" />
    <ImageButton
     android:id="@+id/c2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_above="@+id/c1"
     android:layout_marginBottom="12dip"
     android:layout_marginLeft="28dip"
     android:background="@drawable/channel2" />
    <ImageButton
     android:id="@+id/c3"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_above="@+id/c2"
     android:layout_marginBottom="8dip"
     android:layout_marginLeft="6dip"
     android:layout_toRightOf="@+id/c2"
     android:background="@drawable/channel3" />
    <ImageButton
     android:id="@+id/c4"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_margin="6dip"
     android:background="@drawable/channel4" />
    <ImageButton
     android:id="@+id/c5"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_above="@+id/c6"
     android:layout_marginBottom="8dip"
     android:layout_marginRight="6dip"
     android:layout_toLeftOf="@+id/c6"
     android:background="@drawable/channel5" />
    <ImageButton
     android:id="@+id/c6"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_above="@+id/c7"
     android:layout_alignParentRight="true"
     android:layout_marginBottom="12dip"
     android:layout_marginRight="28dip"
     android:background="@drawable/channel6" />
    <ImageButton
     android:id="@+id/c7"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:layout_alignParentRight="true"
     android:layout_marginBottom="6dip"
     android:layout_marginRight="12dip"
     android:background="@drawable/channel7" />
  </RelativeLayout>
  <RelativeLayout
    android:id="@+id/relate_level2"
    android:layout_width="180dp"
    android:layout_height="90dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/level2" >
    <ImageButton
     android:id="@+id/menu"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_margin="6dip"
     android:background="@drawable/icon_menu" />
    <ImageButton
     android:id="@+id/search"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:layout_margin="10dip"
     android:background="@drawable/icon_search" />
    <ImageButton
     android:id="@+id/myyouku"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:layout_alignParentRight="true"
     android:layout_margin="10dip"
     android:background="@drawable/icon_myyouku" />
  </RelativeLayout>
  <RelativeLayout
    android:id="@+id/relate_level1"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/level1" >
    <ImageButton
     android:id="@+id/home"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:layout_centerHorizontal="true"
     android:layout_marginBottom="10dp"
     android:background="@drawable/icon_home" />
  </RelativeLayout>
</RelativeLayout>

大家看到主要有三个RalativeLayout,就是大家看到的三层,但是关于图片的倾斜 是怎样实现的呢?实际上是个假象,图片是正放的,里面图像是倾斜的。如下图:

这样大概能明白,下面就是开始动画效果了,先看下主Activity:

public class TestYoukuActivity extends Activity {
  /** Called when the activity is first created. */
  private boolean areLevel2Showing = true, areLevel3Showing = true;
  private RelativeLayout relate_level2, relate_level3;
  private ImageButton home, menu;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViews();
    setListener();
  }
  private void findViews() {
    relate_level2 = (RelativeLayout) findViewById(R.id.relate_level2);
    relate_level3 = (RelativeLayout) findViewById(R.id.relate_level3);
    home = (ImageButton) findViewById(R.id.home);
    menu = (ImageButton) findViewById(R.id.menu);
  }
  private void setListener() {
    // 给大按钮设置点击事件
    home.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
       if (!areLevel2Showing) {
        MyAnimation.startAnimationsIn(relate_level2, 500);
       } else {
        if (areLevel3Showing) {
          MyAnimation.startAnimationsOut(relate_level2, 500, 500);
          MyAnimation.startAnimationsOut(relate_level3, 500, 0);
          areLevel3Showing = !areLevel3Showing;
        } else {
          MyAnimation.startAnimationsOut(relate_level2, 500, 0);
        }
       }
       areLevel2Showing = !areLevel2Showing;
     }
    });
    menu.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
       if (!areLevel3Showing) {
        MyAnimation.startAnimationsIn(relate_level3, 500);
       } else {
        MyAnimation.startAnimationsOut(relate_level3, 500, 0);
       }
       areLevel3Showing = !areLevel3Showing;
     }
    });
  }
}

应该注意到了:

代码如下:

MyAnimation.startAnimationsIn(relate_level2, 500);

看一下这个静态方法的实现:

public static void startAnimationsIn(ViewGroup viewgroup, int durationMillis) {
    viewgroup.setVisibility(0);
    for (int i = 0; i < viewgroup.getChildCount(); i++) {
     viewgroup.getChildAt(i).setVisibility(0);
     viewgroup.getChildAt(i).setClickable(true);
     viewgroup.getChildAt(i).setFocusable(true);
    }
    Animation animation;
    animation = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF,
       0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
    animation.setFillAfter(true);
    animation.setDuration(durationMillis);
    viewgroup.startAnimation(animation);
}

RotateAnimation是画面转移旋转动画效果,看一下它的构造方法:

RotateAnimation(Context context, AttributeSet attrs)
Constructor used when a RotateAnimation is loaded from a resource.
         RotateAnimation(float fromDegrees, float toDegrees)
Constructor to use when building a RotateAnimation from code.
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
Constructor to use when building a RotateAnimation from code
         RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
Constructor to use when building a RotateAnimation from code

在这里使用的是第四个构造方法:

fromDegrees:旋转的开始角度。
toDegrees:旋转的结束角度。
pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotXValue:X坐标的伸缩值。
pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotYValue:Y坐标的伸缩值。

关于角度问题:

当角度为负数——表示逆时针旋转 
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)

关于pivotXValue:这一点的X坐标的对象被旋转,在指定的绝对数字0是左边边缘。如果pivotXType数是绝对的这个值可以是一个绝对,另外也可以是百分比(在1.0为100%)。50%是x中点,100%为右边缘。
同理,pivotYValue:这一点的Y坐标的对象被旋转,在指定的绝对数字0是顶部边缘。如果pivotYType数是绝对的这个值可以是一个绝对,另外也可以是百分比(在1.0为100%)。50%是Y中点,100%为下边缘。

然后再看下调用的其他的方法:

setFillAfter:
If fillAfter is true, the transformation that this animation performed will persist when it is finished. Defaults to false if not set. Note that this applies when using an AnimationSet to chain animations. The transformation is not applied before the AnimationSet itself starts.

如果fillAfter为真,transformation 动画将一直运行直到它完成。默认设置为假。注意:这适用于当使用一个AnimationSet连锁动画。transformation 是不适用AnimationSet本身之前开始。

setDuration:设置动画时间。

再看一下退出:

// 图标的动画(出动画)
public static void startAnimationsOut(final ViewGroup viewgroup,
     int durationMillis, int startOffset) {
    Animation animation;
    animation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF,
       0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
    animation.setFillAfter(true);
    animation.setDuration(durationMillis);
    animation.setStartOffset(startOffset);
    animation.setAnimationListener(new Animation.AnimationListener() {
     @Override
     public void onAnimationStart(Animation arg0) {}
     @Override
     public void onAnimationRepeat(Animation arg0) {}
     @Override
     public void onAnimationEnd(Animation arg0) {
       viewgroup.setVisibility(8);
       for (int i = 0; i < viewgroup.getChildCount(); i++) {
        viewgroup.getChildAt(i).setVisibility(8);
        viewgroup.getChildAt(i).setClickable(false);
        viewgroup.getChildAt(i).setFocusable(false);
       }
     }
    });
    viewgroup.startAnimation(animation);
}

有一个animation.setStartOffset(startOffset);是设置animation多长时间以后执行。

最后:代码下载地址:

此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android仿今日头条APP实现下拉导航选择菜单效果

    本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下 关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单.我们可以让我们的应用顶部有左右滑动或进行切换的导航菜单,也可以为了增强用户体验在应用中添加这样的下拉导航选择菜单效果. 关于它的实现原理,其实也是挺简单的,就是使用PopupWindow来进行展现,在显示时控制其高度并配置以相应的动画效果.在PopupWindow中我使用GridView

  • Android编程实现仿美团或淘宝的多级分类菜单效果示例【附demo源码下载】

    本文实例讲述了Android编程实现仿美团或淘宝的多级分类菜单效果.分享给大家供大家参考,具体如下: 这里要实现的是诸如美团/淘宝/百度糯米 多级分类菜单效果.当分类数量非常多时可以考虑采用两级分类,而诸如美团这种表现方式是一个不错的选择. 首先上效果图:   主要代码: 1. PopupWindow初始化过程: popupWindow = new PopupWindow(this); View view = LayoutInflater.from(this).inflate(R.layout.

  • Android实现顶部导航菜单左右滑动效果

    本文给大家介绍在Android中如何实现顶部导航菜单左右滑动效果,具体内容如下 第一种解决方案: 实现原理是使用android-support-v4.jar包中ViewPager控件,在ViewPager控件中设置流布局,再在流布局中设置几项TextView,给每一个TextView设置相关参数,事件等.关于ViewPager控件可以设置全屏幕滑动效果,当然也可以实现局部滑动效果,下面介绍导航菜单. 关于导航菜单,相信大家对它并不陌生,比如在新闻客户端中就经常使用左右滑动菜单来显示不同类别的新闻

  • Android实现自定义滑动式抽屉效果菜单

    在Andoird使用Android自带的那些组件,像SlidingDrawer和DrawerLayout都是抽屉效果的菜单,但是在项目很多要实现的功能都收到Android这些自带组件的限制,导致很难完成项目的需求,自定义的组件,各方面都在自己的控制之下,从而根据需求做出调整.想要实现好的效果,基本上都的基于Android的OnTouch事件自己实现响应的功能. 首先,给大家先看一下整体的效果: 滑动的加速度效果都是有的,具体的体验,只能安装后才能查看. 接下来,看代码: 代码从MainActiv

  • Android编程实现仿优酷圆盘旋转菜单效果的方法详解【附demo源码下载】

    本文实例讲述了Android编程实现仿优酷圆盘旋转菜单效果的方法.分享给大家供大家参考,具体如下: 目前,用户对安卓应用程序的UI设计要求越来越高,因此,掌握一些新颖的设计很有必要. 比如菜单,传统的菜单已经不能满足用户的需求. 其中优酷中圆盘旋转菜单的实现就比较优秀,这里我提供下我的思路及实现,仅供参考. 该菜单共分里外三层导航菜单.可以依次从外向里关闭三层菜单,也可以反向打开,并且伴有圆盘旋转的动画效果 首先,看下效果: 以下是具体的代码及解释: 1. 菜单布局文件: 大家看到主要有三个Ra

  • Android自定义控件之仿优酷菜单

    去年的优酷HD版有过这样一种菜单,如下图: 应用打开之后,先是三个弧形的三级菜单,点击实体键menu之后,这三个菜单依次旋转退出,再点击实体键menu之后,一级菜单会旋转进入,点击一级菜单,二级菜单旋转进入,点击二级菜单的menu键,三级菜单旋转进入,再次点击二级菜单的旋转键,三级菜单又会旋转退出,这时再点击一级菜单,二级菜单退出,最后点击实体menu键,一级菜单退出. 总体来说实现这样的功能: (1)点击实体menu键时,如果界面上有菜单显示,不管有几个,全部依次退出,如果界面上没有菜单显示,

  • Android仿优酷圆形菜单学习笔记分享

    先来看看效果: 首先来分析一下: 这个菜单可以分成三个菜单: 1.一级菜单(即最内圈那个菜单) 2.二级菜单(即中间圈那个菜单) 3.三级菜单(即最外圈那个菜单) 首先,可以将这三个菜单使用相对布局 一级菜单只有一个按钮(即home),可以控制二级和三级菜单 二级菜单有三个按钮(即menu),中间那个按钮可以控制三级菜单 三级菜单有七个按钮 那先把布局文件先写出来,采用三个相对布局(即每个菜单采用一个相对布局) <RelativeLayout xmlns:android="http://s

  • Android仿微信顶/底部菜单栏效果

    本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单按钮,左右滑动page(其实就是xml)并且改变相应按钮的亮度. 一.布局 1.顶部菜单布局,命名为top_layout.xml <?xml version="1.0" encoding="utf-8"?> <R

  • Android App中DrawerLayout抽屉效果的菜单编写实例

    抽屉效果的导航菜单 看了很多应用,觉得这种侧滑的抽屉效果的菜单很好. 不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面上一个按钮点击,菜单就滑出来,而且感觉能放很多东西. 库的引用: 首先, DrawerLayout这个类是在Support Library里的,需要加上android-support-v4.jar这个包. 然后程序中用时在前面导入import android.support.v4.widget.DrawerLayout; 如果找不到这个类,首先用SDK Manager更

  • Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能

    如何为不同的list item呈现不同的菜单,本文实例就为大家介绍了Android仿微信或QQ滑动弹出编辑.删除菜单效果.增加下拉刷新等功能的实现,分享给大家供大家参考,具体内容如下 效果图: 1. 下载开源项目,并将其中的liberary导入到自己的项目中: 2. 使用SwipeMenuListView代替ListView,在页面中布局: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh

  • Android实现下拉菜单Spinner效果

    Android 中下拉菜单,即如html中的<select>,关键在于调用setDropDownViewResource方法,以XML的方式定义下拉菜单要显示的模样 1.1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

随机推荐