前言
最近项目中用到了,多条件可选搜索,因此用到了下拉菜单,效果如下图:
这是一个第三方的控件,在此向作者致敬。项目地址:
https://github.com/dongjunkun/DropDownMenu
作者关于项目的介绍:自己造轮子–android常用多条件筛选菜单实现思路(类似美团,爱奇艺电影票下拉菜单)
之所以将这个自定义控件贴出来,是感觉作者分析问题的能力很强,解决问题的方法也比较巧妙。
源码分析
先分析一下这个视图层级:
这个自定义控件难度不大,但是却很巧妙。弄懂了视图的层级也就搞懂了这个控件的原理。
顶层的菜单布局比较简单,就是一个线性水平布局。
通过对顶层的菜单布局的tab设置点击事件,来决定下方containerView这个FrameLayout布局的显示。
上源码
package com.yyydjk.library;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
/**
* Created by dongjunkun on 2015/6/17.
*/
public class DropDownMenu extends LinearLayout {
//顶部菜单布局
private LinearLayout tabMenuView;
//底部容器,包含popupMenuViews,maskView
private FrameLayout containerView;
//弹出菜单父布局
private FrameLayout popupMenuViews;
//遮罩半透明View,点击可关闭DropDownMenu
private View maskView;
//tabMenuView里面选中的tab位置,-1表示未选中
private int current_tab_position = -1;
//分割线颜色
private int dividerColor = 0xffcccccc;
//tab选中颜色
private int textSelectedColor = 0xff890c85;
//tab未选中颜色
private int textUnselectedColor = 0xff111111