布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp">
<!--<ImageView
android:id="@+id/send"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:padding="10dp"
android:src="@drawable/t"
android:visibility="visible" />-->
<LinearLayout
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:id="@+id/edit"
android:layout_width="60dp"
android:layout_height="60dp"
android:textSize="12sp"
android:gravity="center"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:padding="10dp"
android:text="地图"
android:background="@drawable/yuan"
android:visibility="invisible" />
<TextView
android:id="@+id/confirm"
android:layout_width="60dp"
android:layout_height="60dp"
android:gravity="center"
android:layout_marginTop="@dimen/y10"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:padding="10dp"
android:textSize="12sp"
android:text="设置"
android:background="@drawable/yuan"
android:visibility="invisible" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/plus"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:padding="10dp"
android:src="@drawable/tu1"
android:visibility="visible" />
</LinearLayout>
</LinearLayout>
代码
package com.lingtian.map;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MyMenu extends RelativeLayout implements View.OnClickListener {
private View view;
private TextView confirm;
private ImageView plus;
private TextView edit;
private ImageView send;
boolean isOpen = false;
private float confirmX;
private float plusX;
private float sendX;
private float editX;
public MyMenu(Context context) {
this(context, null);
}
public MyMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init();
setListener();
}
private void init() {
view = LayoutInflater.from(getContext()).inflate(R.layout.my_menu, MyMenu.this);
confirm = (TextView) view.findViewById(R.id.confirm);
plus = (ImageView) view.findViewById(R.id.plus);
edit = (TextView) view.findViewById(R.id.edit);
// send = (ImageView) view.findViewById(R.id.send);
// 为了获得控件平均分布的效果,通过xml布局均分好控件,再到代码中获得均分后控件的位置getX
// 不能立刻获取getX,刚开始立马获得的话,全部为0,因为系统还没有把这些view布置好
new Thread() {
@Override
public void run() {
super.run();
try {
sleep(300);//这里睡的时间要稍微长一点,大于100为宜,否则得不到X位置
} catch (InterruptedException e) {
e.printStackTrace();
}
// 注意getX()得到的是这个View在手机屏幕上的X坐标
// 而TranslationX在首次运行时,永远是0,他表示的是此View离开原始位置的距离
confirmX = confirm.getX();
plusX = plus.getX();
// sendX = send.getX();
editX = edit.getX();
/* Log.e("fs:confirmX", confirmX + "");
Log.e("fs:plusX", plusX + "");
Log.e("fs:sendX", sendX + "");
Log.e("fs:editX", editX + "");*/
confirm.setX(plusX);//此时,这个view已经离开了原始位置了,所以这是打印的TranslationX不是0,是plusX-confirmX
// send.setX(plusX);
edit.setX(plusX);
//Log.e("qqq", confirm.getTranslationX() + "");
}
}.start();
}
private void setListener() {
confirm.setOnClickListener(this);
plus.setOnClickListener(this);
edit.setOnClickListener(this);
//send.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.plus:
if (!isOpen) {
confirm.setVisibility(VISIBLE);
edit.setVisibility(VISIBLE);
// send.setVisibility(VISIBLE);
plus.animate().rotation(45).setDuration(200).start();
//Log.e("qqq", confirm.getTranslationX() + "");
// 注意这里的translationX要回到原始位置
ObjectAnimator animatorConfirm = ObjectAnimator.ofFloat(confirm, "translationX", 0);
ObjectAnimator animatorEdit = ObjectAnimator.ofFloat(edit, "translationX", 0);
ObjectAnimator animatorSend = ObjectAnimator.ofFloat(send, "translationX", 0);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(200);
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorSet.playTogether(animatorConfirm, animatorEdit, animatorSend);
animatorSet.start();
isOpen = true;
} else {
plus.animate().rotation(0).setDuration(100).start();
// 注意这里的translationX要运行到plus后面
ObjectAnimator animatorConfirm = ObjectAnimator.ofFloat(confirm, "translationX", plusX - confirmX);
ObjectAnimator animatorEdit = ObjectAnimator.ofFloat(edit, "translationX", plusX - editX);
ObjectAnimator animatorSend = ObjectAnimator.ofFloat(send, "translationX", plusX - sendX);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(200);
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorSet.playTogether(animatorConfirm, animatorEdit, animatorSend);
animatorSet.start();
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
confirm.setVisibility(GONE);
edit.setVisibility(GONE);
// send.setVisibility(GONE);
}
});
isOpen = false;
}
break;
case R.id.edit:
// 这里可以暴露接口,就不写了
listener.OnListener(v);
break;
/*case R.id.send:
Toast.makeText(getContext(),"send",Toast.LENGTH_SHORT).show();
break;*/
case R.id.confirm:
listener2.OnListener2(v);
break;
}
}
/**
* 定义一个接口
*/
public interface onListener{
void OnListener(View v);
}
/**
*定义一个变量储存数据
*/
private onListener listener;
/**
*提供公共的方法,并且初始化接口类型的数据
*/
public void setListener( onListener listener){
this.listener = listener;
}
/**
* 定义一个接口
*/
public interface onListener2{
void OnListener2(View v);
}
/**
*定义一个变量储存数据
*/
private onListener2 listener2;
/**
*提供公共的方法,并且初始化接口类型的数据
*/
public void setListener2( onListener2 listener){
this.listener2 = listener;
}
}