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

本文实例讲述了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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 旋转菜单
, Android菜单
仿优酷
微信小程序demo源码、swift demo 源码、three.js实现demo源码、devexpress demo 源码、thinkphp5 demo源代码,以便于您获取更多的相关知识。

时间: 2024-10-19 16:25:09

Android编程实现仿优酷旋转菜单效果(附demo源码)_Android的相关文章

Android编程实现TextView垂直自动滚动功能【附demo源码下载】

本文实例讲述了Android编程实现TextView垂直自动滚动功能.分享给大家供大家参考,具体如下: 在做android 应用的开发的时候,横向滚动或者要做出跑马灯的效果很简单,textview本身的属性就支持,只要设置准确就会滚动,开发起来比较简单,但是textview 不支持垂直滚动,那么垂直滚动就需要自己来实现了,很多网友提供的垂直滚 动方案都是千篇一律,使用ScrollView来进行滚动,但是都不完美,做起来有些别扭.有一位网友给出的歌词的滚动思路明确,能从根本上解决问题,因此我实现的

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

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

Android编程实现可滑动的开关效果(附demo源码下载)_Android

本文实例讲述了Android编程实现可滑动的开关效果.分享给大家供大家参考,具体如下: 闲着没事,把之前写的一个Demo放上来分享下.就是一个开关,实现可滑动和动画效果.不是图片切换. 好了,先上图: 完整实例代码点击此处本站下载. 直接把自定义的这个View代码放上来,有注释应该很好理解: 首先是布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&qu

Android编程基于Contacts读取联系人的方法(附demo源码)_Android

本文实例讲述了Android编程基于Contacts读取联系人的方法.分享给大家供大家参考,具体如下: Android Contacts简介: 这里介绍安卓通讯录数据库.包括Android使用Contacts访问SQLite的基本知识,并了解Android SQLite和Contacts的更多信息.谷歌改变了从版本1到版本2的Contacts数据库.下面加以简单介绍. Contacts 读取代码: package com.homer.phone; import java.util.ArrayLi

Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】_Android

本文实例讲述了Android开发进阶自定义控件之滑动开关实现方法.分享给大家供大家参考,具体如下: 自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Androi

Android编程实现可滑动的开关效果(附demo源码下载)

本文实例讲述了Android编程实现可滑动的开关效果.分享给大家供大家参考,具体如下: 闲着没事,把之前写的一个Demo放上来分享下.就是一个开关,实现可滑动和动画效果.不是图片切换. 好了,先上图: 完整实例代码点击此处本站下载. 直接把自定义的这个View代码放上来,有注释应该很好理解: 首先是布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&qu

HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)_jquery

本文讲述了HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果.分享给大家供大家参考,具体如下: 因为本人是星际争霸系列游戏的忠实拥簇,所以在今天的jQuery教程中,我们将使用HTML5和jQuery插件Quicksand来创建一个超酷的星际争霸兵种效果图.希望大家喜欢! 先来看看效果图: HTML5代码 首先我们使用HTML5的代码来创建一个html文档,将所需的quicksand类库,及其jquery类库,还有HTML5类库倒入,如下: <!DOCTYPE h

Android重写TextView实现文字整齐排版的方法(附demo源码下载)_Android

本文实例讲述了Android重写TextView实现文字整齐排版的方法.分享给大家供大家参考,具体如下: XRTextView类 package rong.android.test; import org.json.JSONArray; import org.json.JSONException; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor

Android重写TextView实现文字整齐排版的方法(附demo源码下载)

本文实例讲述了Android重写TextView实现文字整齐排版的方法.分享给大家供大家参考,具体如下: XRTextView类 package rong.android.test; import org.json.JSONArray; import org.json.JSONException; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor