您的位置:首页 > 其它

通过Animator实现弧形弹出菜单

2015-09-22 13:08 323 查看
//布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"

android:layout_height="match_parent" >

<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/b" />

<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/c" />

<ImageView
android:id="@+id/imageView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/d" />

<ImageView
android:id="@+id/imageView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/e" />

<ImageView
android:id="@+id/imageView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/f" />

<ImageView
android:id="@+id/imageView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/g" />

<ImageView
android:id="@+id/imageView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/h" />

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/a" />

</FrameLayout>




效果图;

下面是JAVA代码;

package com.imooc.animator;

import java.util.ArrayList;
import java.util.List;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.BounceInterpolator;
import android.widget.ImageView;
import android.widget.Toast;

public class ThirdActivity extends Activity implements OnClickListener {

private int[] resId = { R.id.imageView1, R.id.imageView2, R.id.imageView3,
R.id.imageView4, R.id.imageView5, R.id.imageView6, R.id.imageView7,
R.id.imageView8 };

private List<View> imgList = new ArrayList<View>();

private boolean isStop = true;
private int width;
//转换成角度
double arc = Math.toRadians(15);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.animatorfortest);
// 初始化控件
for (int i = 0; i < resId.length; i++) {
ImageView imgView = (ImageView) findViewById(resId[i]);
imgView.setOnClickListener(this);
imgList.add(imgView);
}

// 获取屏幕宽度
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels; // 屏幕宽度;

}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageView1:
if (isStop) {
// 展开动画
startMyAnimation();
} else {
// 收回动画
stopMyAnimation();
}
break;

default:
Toast.makeText(ThirdActivity.this, "点击了:" + v.getId(),
Toast.LENGTH_SHORT).show();
break;
}

}

// 收回动画
private void stopMyAnimation() {

for (int i = 1; i < imgList.size(); i++) {

ObjectAnimator mAnimatorX = ObjectAnimator.ofFloat(imgList.get(i),
"TranslationX", (float)((width/2)*Math.cos(arc*(i-1))),0F);
ObjectAnimator mAnimatorY = ObjectAnimator.ofFloat(imgList.get(i),
"TranslationY", (float)((width/2)*Math.sin(arc*(i-1))),0F);

Log.i("lang", "[i="+i+"]X="+(float)((width/2)*Math.cos(arc*(i-1)))+",Y="+(float)((width/2)*Math.sin(arc*(i-1))));

AnimatorSet set = new AnimatorSet();
set.playTogether(mAnimatorX,mAnimatorY);
set.setDuration(500);
set.start();

isStop = true;
}

}

// 展开动画
private void startMyAnimation() {
for (int i = 1; i < imgList.size(); i++) {

ObjectAnimator mAnimatorX = ObjectAnimator.ofFloat(imgList.get(i),
"TranslationX", 0f,(float)((width/2)*Math.cos(arc*(i-1))));
ObjectAnimator mAnimatorY = ObjectAnimator.ofFloat(imgList.get(i),
"TranslationY", 0f,(float)((width/2)*Math.sin(arc*(i-1))));

Log.i("lang", "[i="+i+"]X="+(float)((width/2)*Math.cos(arc*(i-1)))+",Y="+(float)((width/2)*Math.sin(arc*(i-1))));

AnimatorSet set = new AnimatorSet();
set.playTogether(mAnimatorX,mAnimatorY);
set.setDuration(500);
set.setInterpolator(new BounceInterpolator());
set.start();

isStop = false;
}

}

}


模拟器效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: