Android 폭발 메뉴 버튼 팝 업 효과 구현

최근 프로젝트 는 하나의 단 추 를 누 르 면 여러 개의 단 추 를 팝 업 하 는 효 과 를 사용 해 야 합 니 다.몇 개의 라 이브 러 리 를 시도 한 후에 이상 적 이지 않 아서 자신의 코드 가 하 나 를 실현 하 였 습 니 다.다음 그림 은 다음 과 같 습 니 다.

실현 원 리 는 매우 간단 하 다.바로 안 드 로 이 드 어 쿠 스틱 애니메이션 효 과 를 이용 하여 중심 단 추 를 눌 렀 을 때 나머지 단 추 를 꺼 내 는 것 이다.잡담 은 그만 하고 코드 는 아래 와 같다.
STEP 1:activitymain.xml 는 간단 합 니 다.즉,같은 위치 에 있 는 다섯 개의 버튼 입 니 다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <ImageButton
  android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:layout_margin="10dp"
  android:src="@drawable/im" 
  android:background="@android:color/transparent"/>
 <ImageButton
  android:id="@+id/button1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:layout_margin="10dp"
  android:visibility="invisible" 
  android:src="@drawable/i"
  android:background="@android:color/transparent"/>
 <ImageButton
  android:id="@+id/button2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:layout_margin="10dp"
  android:src="@drawable/ii"
  android:visibility="invisible" 
  android:background="@android:color/transparent"/>
 <ImageButton
  android:id="@+id/button3"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:layout_margin="10dp"
  android:src="@drawable/iii"
  android:visibility="invisible"
  android:background="@android:color/transparent"/>
 <ImageButton
  android:id="@+id/button4"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:layout_margin="10dp"
  android:src="@drawable/iiii"
  android:visibility="invisible"
  android:background="@android:color/transparent" />

</RelativeLayout>

STEP 2:MainActivity

package com.example.boombuttons;
import java.util.ArrayList;
public class MainActivity extends Activity implements OnClickListener{
 //     
 private ImageButton button;
 //      
 private ImageButton button1;
 private ImageButton button2; 
 private ImageButton button3; 
 private ImageButton button4;
 //      
 private List<ImageButton> buttonItems = new ArrayList<ImageButton>(3);
 //           ,1       ,-1     
 private int flag = 1;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //           
  button = (ImageButton)findViewById(R.id.button);
  button.setOnClickListener(this);
  button1 = (ImageButton)findViewById(R.id.button1);
  button2 = (ImageButton)findViewById(R.id.button2);
  button3 = (ImageButton)findViewById(R.id.button3);
  button4 = (ImageButton)findViewById(R.id.button4);
  //           
  buttonItems.add(button1);
  buttonItems.add(button2);
  buttonItems.add(button3);
  buttonItems.add(button4); 
 }
 /**
  *       
  * @params      
  * @params        radius
  */
 public void buttonAnimation(List<ImageButton> buttonList,int radius){
  for(int i=0;i<buttonList.size();i++){
   ObjectAnimator objAnimatorX;
   ObjectAnimator objAnimatorY;
   ObjectAnimator objAnimatorRotate;
   //        
   buttonList.get(i).setVisibility(View.VISIBLE);
   //    X、Y       
   float distanceX = (float) (flag*radius*(Math.cos(Util.getAngle(buttonList.size(),i))));
   float distanceY = -(float) (flag*radius*(Math.sin(Util.getAngle(buttonList.size(),i))));
   // X    
   objAnimatorX = ObjectAnimator.ofFloat(buttonList.get(i), "x", buttonList.get(i).getX(),buttonList.get(i).getX()+distanceX);
   objAnimatorX.setDuration(200);
   objAnimatorX.setStartDelay(100);
   objAnimatorX.start();
   // Y    
   objAnimatorY = ObjectAnimator.ofFloat(buttonList.get(i), "y", buttonList.get(i).getY(),buttonList.get(i).getY()+distanceY);
   objAnimatorY.setDuration(200);
   objAnimatorY.setStartDelay(100);
   objAnimatorY.start();
   //     
   objAnimatorRotate = ObjectAnimator.ofFloat(buttonList.get(i), "rotation", 0, 360);
   objAnimatorRotate.setDuration(200);
   objAnimatorY.setStartDelay(100);
   objAnimatorRotate.start();
   if(flag==-1){
    objAnimatorX.addListener(new AnimatorListener() {
     @Override
     public void onAnimationStart(Animator animation) {
      // TODO Auto-generated method stub
     }
     @Override
     public void onAnimationRepeat(Animator animation) {
      // TODO Auto-generated method stub
     }
     @Override
     public void onAnimationEnd(Animator animation) {
      // TODO Auto-generated method stub
      //        
      for (int i = 0; i < buttonItems.size(); i++) {
       buttonItems.get(i).setVisibility(View.INVISIBLE);
      }
     }
     @Override
     public void onAnimationCancel(Animator animation) {
      // TODO Auto-generated method stub
     }
    });
   }
  }
 }
}

세 번 째 단계:Util.java 도구 클래스 는 단추 개수 와 단 추 를 통 해 목록 에 있 는 색인 을 통 해 팝 업 각 도 를 계산 하 는 정적 방법 을 썼 습 니 다.

public class Util {
 /**
  *              (    )
  * @param index
  * @return double   (    )
  */
 public static double getAngle(int total,int index){
  return Math.toRadians(90/(total-1)*index+90);
 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기