大家可能没有见过旋转菜单的,但是我这次要做的就是类似优酷上的旋转菜单。
要做成这样,首先你得做好布局:
mainActivity。xml文件:
<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/rel3"
android:layout_width="215dp"
android:layout_height="125dp"
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_marginLeft="3dp"
android:src="@drawable/channel1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/channel1"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:src="@drawable/channel2" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="45dp"
android:layout_marginTop="20dp"
android:src="@drawable/channel3" />
<ImageView
android:id="@+id/channel4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:src="@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_marginRight="5dp"
android:src="@drawable/channel7" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/imageView1"
android:layout_marginLeft="14dp"
android:layout_toRightOf="@+id/channel4"
android:src="@drawable/channel5" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/imageView2"
android:layout_toRightOf="@+id/imageView3"
android:src="@drawable/channel6" />
</RelativeLayout>
<!-- 二级菜单 -->
<RelativeLayout
android:id="@+id/rel2"
android:layout_width="140dp"
android:layout_height="80dp"
android:background="@drawable/level2"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_search"
android:layout_alignParentBottom="true"
android:layout_marginLeft="3dp"
/>
<ImageView
android:id="@+id/menu_Iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_menu"
android:layout_centerHorizontal="true"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_myyouku"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
<!-- 一级菜单 -->
<RelativeLayout
android:layout_width="80dp"
android:layout_height="45dp"
android:background="@drawable/level1"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
>
<ImageView
android:id="@+id/home_iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/icon_home"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
</RelativeLayout>
做好布局之后我们就可以给三个菜单加动画效果了,所以我们设置了第二菜单和第三菜单的Id
Main.java
package com.xx.youku;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends Activity implements OnClickListener{
private ImageView home_IV,menu_iv;
private boolean level2isPlay=true; //判断二级菜单的显示状况
private boolean level3isPlay=true; //判断二级菜单的显示状况
private RelativeLayout r2;
private RelativeLayout r3;
private int flag; //判断有几个动画在执行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
home_IV =(ImageView)findViewById(R.id.home_iv);
r2=(RelativeLayout)findViewById(R.id.rel2);
r3=(RelativeLayout)findViewById(R.id.rel3);
menu_iv=(ImageView)findViewById(R.id.menu_Iv);
home_IV.setOnClickListener(this);
menu_iv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.home_iv:
//点击home按钮的逻辑代码
ClickHomeIv();
break;
case R.id.menu_Iv:
clickMenu();
break;
default:
break;
}
}
public void ClickHomeIv(){
//分情况考虑
if(flag>0){
return;
}
//1、二级菜单和三级菜单都显示。将二三级菜单隐藏,并且改变标记位
if(level2isPlay&&level3isPlay){
hideMenu(r2,100);
hideMenu(r3,150);
level2isPlay=false;
level3isPlay=false;
return;
}
//2、二三级菜单都不显示。那么只显示二级菜单,并且改变标记位
if (!level2isPlay&&!level3isPlay) {
showMenu(r2);
level2isPlay=true;
return;
}
//3、二级菜单显示且三级菜单不显示,那么将二级菜单隐藏,并且改变标记位
if(level2isPlay&&!level3isPlay){
hideMenu(r2,0);
level2isPlay=false;
return;
}
}
//显示菜单
private void showMenu(RelativeLayout view){
//view.setVisibility(View.VISIBLE);
int count=view.getChildCount();
for(int i=0;i<count;i++){
view.getChildAt(i).setEnabled(true);
}
RotateAnimation ra=new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
ra.setDuration(500);
ra.setFillAfter(true);
ra.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
flag++;
}
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
flag--;
}
});
view.startAnimation(ra);
}
/*
* 隐藏菜单
*/
private void hideMenu(RelativeLayout view,long startOffset){
//view.setVisibility(View.GONE);
//如果要隐藏菜单,那么就将相应的控件设为没有焦点
//获取父容器中有几个子控件
int count=view.getChildCount();
for(int i=0;i<count;i++){
view.getChildAt(i).setEnabled(false);
}
/*
* fromDegrees起始旋转角度,toDegrees旋转多少角度,pivotXType X轴的伸缩模式,pivotYType Y轴的伸缩模式
* (pivotXValue,pivotYValue) 旋转中心点
*/
//RotateAnimation re=new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue)
RotateAnimation ra=new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
ra.setDuration(500); //动画持续时间
///动画结束时停留的位置
ra.setFillAfter(true); //让菜单停留在动画结束的位置上
//设置其startOffset为动态加载
ra.setStartOffset(startOffset); //设置动画的延迟执行
ra.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
flag++;
}
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
flag--;
}
});
view.startAnimation(ra);
}
//点击menu按钮逻辑
private void clickMenu(){
if(flag>0){
return;
}
if (level3isPlay) {
hideMenu(r3,0);
level3isPlay=false;
return;
}
if(!level3isPlay
//&&level2isPlay
){
showMenu(r3);
level3isPlay=true;
return;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
其中最重要的是它的动态的判断:
而后的其他的我再上面的代码中注释的很清楚了,希望对你会有所帮助。