import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
public class CustomContainerViewGroup extends LinearLayout implements View.OnClickListener {
private static final int ANIMATION_DURING_TIME =200 ;
private Context context;
private int containerFrameLayoutHeight;
private LinearLayout tabView;
private View shadowView;
private FrameLayout containerFrameLayout;
private MenuListAdapter menuListAdapter;
private int mCurrentPosition=-1;
//设置一个变量监测动画是否在执行
private boolean mAnimationExecute=false;
public CustomContainerViewGroup(Context context) {
this(context,null);
}
public CustomContainerViewGroup(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CustomContainerViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context=context;
containerFrameLayoutHeight=getHeight()*60/100;
initLayout();
}
private void initLayout(){
setOrientation(VERTICAL);
//这是标题栏
tabView=new LinearLayout(context);
tabView.setBackgroundColor(Color.RED);
LinearLayout.LayoutParams params_tab_view=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,dip2dp(30));
tabView.setLayoutParams(params_tab_view);
addView(tabView);
//中间最底层布局
FrameLayout middleFrameLayout=new FrameLayout(context);
FrameLayout.LayoutParams params_middle_frame_layout=new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
middleFrameLayout.setLayoutParams(params_middle_frame_layout);
addView(middleFrameLayout);
//设置阴影布局层
shadowView=new View(context);
shadowView.setBackgroundColor(Color.parseColor("#999999"));
ViewGroup.LayoutParams params_shadow_view=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
shadowView.setLayoutParams(params_shadow_view);
middleFrameLayout.addView(shadowView);
shadowView.setVisibility(GONE);
shadowView.setOnClickListener(this);
//设置因布局容器
containerFrameLayout=new FrameLayout(context);
containerFrameLayout.setBackgroundColor(Color.WHITE);
middleFrameLayout.addView(containerFrameLayout);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height=MeasureSpec.getSize(heightMeasureSpec);
if (containerFrameLayoutHeight==0){
containerFrameLayoutHeight=height*50/100;
ViewGroup.LayoutParams containerFrameParas=containerFrameLayout.getLayoutParams();
containerFrameParas.height=containerFrameLayoutHeight;
containerFrameLayout.setLayoutParams(containerFrameParas);
containerFrameLayout.setTranslationY(-containerFrameLayoutHeight);
}
}
public void setMenuListAdapter(MenuListAdapter menuListAdapter){
this.menuListAdapter=menuListAdapter;
int count=this.menuListAdapter.getCount();
for (int i=0;i<count;i++){
TextView tabTextView= (TextView) this.menuListAdapter.getTabView(i,tabView);
LinearLayout.LayoutParams params= (LayoutParams) tabTextView.getLayoutParams();
params.weight=1;
tabTextView.setLayoutParams(params);
tabView.addView(tabTextView);
setTabViewOnClick(i,tabTextView);
TextView containerTextView= (TextView) this.menuListAdapter.getContainerView(i,containerFrameLayout);
containerTextView.setVisibility(GONE);
containerFrameLayout.addView(containerTextView);
}
}
private void setTabViewOnClick(final int position, final View tabViewPara){
tabViewPara.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentPosition==-1){
openMenuList(position);
}else {
//在这里设置菜单的切换
if (mCurrentPosition==position){
closeMenuList();
}else {
//把原来的关闭,打开新的
View view_1=containerFrameLayout.getChildAt(mCurrentPosition);
view_1.setVisibility(GONE);
menuListAdapter.closeMenu(view_1);
menuListAdapter.closeMenu(tabView.getChildAt(mCurrentPosition));
mCurrentPosition=position;
view_1=containerFrameLayout.getChildAt(mCurrentPosition);
view_1.setVisibility(VISIBLE);
menuListAdapter.openMenu(tabView.getChildAt(mCurrentPosition));
}
}
}
});
}
@Override
public void onClick(View v) {
//点击阴影关闭菜单
closeMenuList();
}
private void openMenuList(final int position){
if (mAnimationExecute){
return;
}
shadowView.setVisibility(VISIBLE);
ObjectAnimator containerTranslationY=ObjectAnimator.ofFloat(containerFrameLayout,"translationY",-getHeight(),0);
containerTranslationY.setInterpolator(new DecelerateInterpolator());
//获取容器中的子View
View menuView=containerFrameLayout.getChildAt(position);
menuView.setVisibility(VISIBLE);
ObjectAnimator alphaTranslation=ObjectAnimator.ofFloat(shadowView,"alpha",0f,1f);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.setDuration(ANIMATION_DURING_TIME);
animatorSet.playTogether(containerTranslationY,alphaTranslation);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mAnimationExecute=true;
menuListAdapter.openMenu(tabView.getChildAt(position));
}
@Override
public void onAnimationEnd(Animator animation) {
mAnimationExecute=false;
mCurrentPosition=position;
}
});
animatorSet.start();
}
private void closeMenuList(){
if (mAnimationExecute){
return;
}
ObjectAnimator containerTranslationY=ObjectAnimator.ofFloat(containerFrameLayout,"translationY",0,-getHeight());
ObjectAnimator alphaTranslation=ObjectAnimator.ofFloat(shadowView,"alpha",1f,0f);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.setDuration(ANIMATION_DURING_TIME);
animatorSet.playTogether(containerTranslationY,alphaTranslation);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
View menuView=containerFrameLayout.getChildAt(mCurrentPosition);
menuView.setVisibility(GONE);
mCurrentPosition=-1;
shadowView.setVisibility(GONE);//这一句话必须设置,要不然虽然阴影没有了,但是还是会占用布局
mAnimationExecute=false;
}
@Override
public void onAnimationStart(Animator animation) {
menuListAdapter.closeMenu(tabView.getChildAt(mCurrentPosition));
mAnimationExecute=true;
}
});
animatorSet.start();
}
private int dip2dp(int dip){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dip,getResources().getDisplayMetrics());
}
}
import android.view.View;
import android.view.ViewGroup;
public abstract class MenuListAdapter {
public abstract int getCount();
public abstract View getTabView(int position , ViewGroup parent);
public abstract View getContainerView(int position , ViewGroup parent);
public void closeMenu(View childAt) {
}
public void openMenu(View childAt) {
}
}
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.didi.myproject.R;
public class MyMenuListAdapter extends MenuListAdapter {
private Context mContext;
private String[] tabTitle={"诚信","友善","公平","法制"};
public MyMenuListAdapter(Context context){
this.mContext=context;
}
@Override
public int getCount() {
return tabTitle.length;
}
@Override
public View getTabView(int position,ViewGroup parent) {
TextView tabTitleView= (TextView) LayoutInflater.from(mContext).inflate(R.layout.tab_view_layout, parent,false);
tabTitleView.setText(tabTitle[position]);
return tabTitleView;
}
@Override
public View getContainerView(int position,ViewGroup parent) {
TextView menuView= (TextView) LayoutInflater.from(mContext).inflate(R.layout.tab_view_layout, parent,false);
menuView.setText(tabTitle[position]);
return menuView;
}
@Override
public void openMenu(View childAt) {
TextView tabTitleView= (TextView) childAt;
tabTitleView.setTextColor(Color.BLUE);
}
@Override
public void closeMenu(View childAt) {
TextView tabTitleView= (TextView) childAt;
tabTitleView.setTextColor(Color.BLACK);
}
}