android开发自定义下拉菜单


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);
    }
}
发布了75 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yaoyaoyao_123/article/details/91561828