酷炫的彈力菜單,有橫向和圓弧兩種
作者:佚名
酷炫的彈力菜單,有橫向和圓弧兩種。
源碼簡(jiǎn)介
酷炫的彈力菜單,有橫向和圓弧兩種。
注:該源碼圓弧菜單點(diǎn)擊時(shí),會(huì)導(dǎo)致程序崩潰.
源碼運(yùn)行截圖
源碼片段:
- package com.spring.menu.activity;
- import com.spring.menu.R;
- import com.spring.menu.animation.SpringAnimation;
- import com.spring.menu.animation.EnlargeAnimationOut;
- import com.spring.menu.animation.ShrinkAnimationOut;
- import com.spring.menu.animation.ZoomAnimation;
- import com.spring.menu.utility.DeviceUtility;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.View.OnClickListener;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.view.animation.AnticipateInterpolator;
- import android.widget.RelativeLayout;
- /**
- * Android實(shí)現(xiàn)伸縮彈力分布菜單效果
- * @Description: Android實(shí)現(xiàn)伸縮彈力分布菜單效果
- * @File: MainActivity.java
- * @Package com.spring.menu.activity
- * @Author Hanyonglu
- * @Date 2012-10-25 下午09:41:31
- * @Version V1.0
- */
- public class MainActivity extends Activity {
- private boolean areMenusShowing;
- private ViewGroup menusWrapper;
- private View imageViewPlus;
- private View shrinkRelativeLayout;
- private RelativeLayout layoutMain;
- // 順時(shí)針旋轉(zhuǎn)動(dòng)畫
- private Animation animRotateClockwise;
- // 你試著旋轉(zhuǎn)動(dòng)畫
- private Animation animRotateAntiClockwise;
- private Class<!--?-->[] intentActivity = {
- SecondActivity.class,ThreeActivity.class,FourActivity.class,
- SecondActivity.class,ThreeActivity.class,FourActivity.class};
- private int[] mainResources = {
- R.drawable.bg_main_1,R.drawable.bg_main_2,
- R.drawable.bg_main_3,R.drawable.bg_main_4,
- R.drawable.bg_main_1,R.drawable.bg_main_4};
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main_activity);
- // 初始化
- initViews();
- }
- // 初始化
- private void initViews(){
- imageViewPlus = findViewById(R.id.imageview_plus);
- menusWrapper = (ViewGroup) findViewById(R.id.menus_wrapper);
- shrinkRelativeLayout = findViewById(R.id.relativelayout_shrink);
- layoutMain = (RelativeLayout) findViewById(R.id.layout_content);
- animRotateClockwise = AnimationUtils.loadAnimation(
- this,R.anim.rotate_clockwise);
- animRotateAntiClockwise = AnimationUtils.loadAnimation(
- this,R.anim.rotate_anticlockwise);
- shrinkRelativeLayout.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showLinearMenus();
- }
- });
- for (int i = 0; i < menusWrapper.getChildCount(); i++) {
- menusWrapper.getChildAt(i).setOnClickListener(
- new SpringMenuLauncher(null,mainResources[i]));
- }
- }
- /**
- * 以直線型展開菜單
- */
- private void showLinearMenus() {
- int[] size = DeviceUtility.getScreenSize(this);
- if (!areMenusShowing) {
- SpringAnimation.startAnimations(
- this.menusWrapper, ZoomAnimation.Direction.SHOW, size);
- this.imageViewPlus.startAnimation(this.animRotateClockwise);
- } else {
- SpringAnimation.startAnimations(
- this.menusWrapper, ZoomAnimation.Direction.HIDE, size);
- this.imageViewPlus.startAnimation(this.animRotateAntiClockwise);
- }
- areMenusShowing = !areMenusShowing;
- }
- // 分布菜單事件監(jiān)聽器
- private class SpringMenuLauncher implements OnClickListener {
- private final Class<!--?--> cls;
- private int resource;
- private SpringMenuLauncher(Class<!--?--> c,int resource) {
- this.cls = c;
- this.resource = resource;
- }
- public void onClick(View v) {
- // TODO Auto-generated method stub
- MainActivity.this.startSpringMenuAnimations(v);
- layoutMain.setBackgroundResource(resource);
- // MainActivity.this.startActivity(
- // new Intent(
- // MainActivity.this,
- // MainActivity.SpringMenuLauncher.this.cls));
- }
- }
- /**
- * 展現(xiàn)菜單動(dòng)畫效果
- * @param view
- * @param runnable
- */
- private void startSpringMenuAnimations(View view) {
- areMenusShowing = true;
- Animation shrinkOut1 = new ShrinkAnimationOut(300);
- Animation growOut = new EnlargeAnimationOut(300);
- shrinkOut1.setInterpolator(new AnticipateInterpolator(2.0F));
- shrinkOut1.setAnimationListener(new Animation.AnimationListener() {
- public void onAnimationEnd(Animation animation) {
- // TODO Auto-generated method stub
- MainActivity.this.imageViewPlus.clearAnimation();
- }
- public void onAnimationRepeat(Animation animation) {
- // TODO Auto-generated method stub
- }
- public void onAnimationStart(Animation animation) {
- // TODO Auto-generated method stub
- }
- });
- view.startAnimation(growOut);
- }
- }
- 在點(diǎn)擊紅色按鈕時(shí)彈出最上面的菜單,點(diǎn)擊某個(gè)菜單時(shí)變換上面的背景圖片,當(dāng)然也可直接進(jìn)入某個(gè)Activity。所以上面定義了intentActivity和mainResources兩個(gè)數(shù)組,分別代表切換的Activity和要變換的圖片。大家可根據(jù)實(shí)際的需要進(jìn)行設(shè)置。在進(jìn)行點(diǎn)擊紅色按鈕時(shí)中間的加號(hào)向右進(jìn)行旋轉(zhuǎn)225變成叉號(hào),通過如下的動(dòng)畫:
- View Row Code
- <!--?xml version="1.0" encoding="UTF-8"?-->
- <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator" android:duration="200" android:fromdegrees="0.0" android:todegrees="225.0" android:pivotx="50.0%" android:pivoty="50.0%" android:fillafter="true" android:fillenabled="true">
- 再次點(diǎn)擊則向左旋轉(zhuǎn)還原,將上面的android:fromDegrees和android:toDegrees替換下即可。
- 下面了解下另一個(gè)重要的動(dòng)畫類是SpringAnimation,由它來控制各個(gè)菜單的動(dòng)畫效果,代碼如下所示:
- View Row Code
- package com.spring.menu.animation;
- import com.spring.menu.control.ImageButtonExtend;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.ViewGroup.MarginLayoutParams;
- import android.view.animation.AnticipateInterpolator;
- import android.view.animation.AnticipateOvershootInterpolator;
- import android.view.animation.OvershootInterpolator;
- import android.view.animation.TranslateAnimation;
- /**
- * 分布菜單加載和伸縮動(dòng)畫
- * @Description: 分布菜單加載和伸縮動(dòng)畫
- * @File: SpringAnimation.java
- * @Package com.spring.menu.animation
- * @Author Hanyonglu
- * @Date 2012-10-25 下午12:18:39
- * @Version V1.0
- */
- public class SpringAnimation extends ZoomAnimation {
- private static int[] size;
- private static int xOffset = 210;
- private static int yOffset = -15;
- public static final int DURATION = 300;
- /**
- * 構(gòu)造器
- * @param direction
- * @param duration
- * @param view
- */
- public SpringAnimation(Direction direction, long duration, View view) {
- super(direction, duration, new View[] { view });
- SpringAnimation.xOffset = SpringAnimation.size[0] / 2 - 30;
- }
- /**
- * 開始顯示動(dòng)畫效果
- * @param viewgroup
- * @param direction
- * @param size
- */
- public static void startAnimations(ViewGroup viewgroup,
- ZoomAnimation.Direction direction, int[] size) {
- SpringAnimation.size = size;
- switch (direction) {
- case HIDE:
- startShrinkAnimations(viewgroup);
- break;
- case SHOW:
- startEnlargeAnimations(viewgroup);
- break;
- }
- }
- /**
- * 開始呈現(xiàn)菜單
- * @param viewgroup
- */
- private static void startEnlargeAnimations(ViewGroup viewgroup) {
- for (int i = 0; i < viewgroup.getChildCount(); i++) {
- if (viewgroup.getChildAt(i) instanceof ImageButtonExtend) {
- ImageButtonExtend inoutimagebutton = (ImageButtonExtend) viewgroup
- .getChildAt(i);
- SpringAnimation animation = new SpringAnimation(
- ZoomAnimation.Direction.HIDE, DURATION, inoutimagebutton);
- animation.setStartOffset((i * 200)
- / (-1 + viewgroup.getChildCount()));
- animation.setInterpolator(new OvershootInterpolator(4F));
- inoutimagebutton.startAnimation(animation);
- }
- }
- }
- /**
- * 開始隱藏菜單
- * @param viewgroup
- */
- private static void startShrinkAnimations(ViewGroup viewgroup) {
- for (int i = 0; i < viewgroup.getChildCount(); i++) {
- if (viewgroup.getChildAt(i) instanceof ImageButtonExtend) {
- ImageButtonExtend inoutimagebutton = (ImageButtonExtend) viewgroup
- .getChildAt(i);
- SpringAnimation animation = new SpringAnimation(
- ZoomAnimation.Direction.SHOW, DURATION,
- inoutimagebutton);
- animation.setStartOffset((100 * ((-1 + viewgroup
- .getChildCount()) - i))
- / (-1 + viewgroup.getChildCount()));
- animation.setInterpolator(new AnticipateOvershootInterpolator(2F));
- inoutimagebutton.startAnimation(animation);
- }
- }
- }
- @Override
- protected void addShrinkAnimation(View[] views) {
- // TODO Auto-generated method stub
- MarginLayoutParams mlp = (MarginLayoutParams) views[0].
- getLayoutParams();
- addAnimation(new TranslateAnimation(
- xOffset + -mlp.leftMargin,
- F,yOffset + mlp.bottomMargin, 0F));
- }
- @Override
- protected void addEnlargeAnimation(View[] views) {
- // TODO Auto-generated method stub
- MarginLayoutParams mlp = (MarginLayoutParams) views[0].
- getLayoutParams();
- addAnimation(new TranslateAnimation(
- F, xOffset + -mlp.leftMargin,
- F,yOffset + mlp.bottomMargin));
- }
- }</rotate>
源碼鏈接:http://down.51cto.com/data/1968733
【責(zé)任編輯:chenqingxiang TEL:(010)68476606】
責(zé)任編輯:chenqingxiang
來源:
網(wǎng)絡(luò)整理