Android自定义Button结合PopupWindow和ListView实现顺序显示下拉菜单控件

废话不多说,直接上效果图:



实现效果描述:点击按钮之后,会在按钮下方弹出下拉菜单,并且下拉菜单的内容一依次显示到屏幕之上


实现思路:

1、首先要解决按钮的样式问题, 可以使用指定背景为shape

2、接下来点击按钮时,需要在按钮的下方弹出相应的视图View(比如上图中的一个ListView)

3、最后解决如何依次播放ListView中的每一个item的内容


接下来依次解决上述问题:

1、先来解决按钮的样式问题

在res/文件夹下,创建drawable文件夹,并在其中创建pop_btn_shape.xml文件,在其中定义Button的背景形状和样式,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <!-- 填充颜色为亮灰色 -->
    <solid android:color="#c0c0c0"/>
    
    <!-- 描边颜色为银色 -->
    <stroke android:width="2dp"
        android:color="#a9a9a9"/>
    
    <!-- 边角为45度 -->
    <corners android:radius="45dp"/>

</shape>

将此样式设置为Button的背景之后显示如下效果:

setBackgroundResource(R.drawable.pop_btn_shape);



2、按钮样式解决之后,接下来解决点击按钮,在按钮下方弹出列别视图的效果

如下代码所示,当点击按钮之后,创建一个PopupWindow对象,并将ListView设置为PopupWindow所要显示的内容

//如果PopupWindow为空,则重新创建并显示
		if (mPopWindow == null) {
			mPopWindow = new PopupWindow();
			mPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {

				@Override
				public void onDismiss() {
					setSelected(false);
				}
			});
		}
		// 初始化PopupWindow所需要显示的视图View
		LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View popupLayout = inflater.inflate(R.layout.pop_list, null);
		// 通过popupLayout找到ListView
		mListView = (ListView) popupLayout.findViewById(R.id.lv_popup_list);
		// 填充ListView并动态计算它的高度
		inflateAndMeasure(mListView);
		
		// 将ListView设置为PopupWindow的视图
		mPopWindow.setContentView(popupLayout);

注意:因为按钮控件默认就应该有点击事件,所以需要自定义类,继承Button并实现View.OnClickListener接口的onClick方法,然后在初始化Button时,调用上述代码创建PopupWindow对象,当Button被点击时,在onClick方法中显示PopupWindow,如下代码所示:

@Override
	public void onClick(View v) {
		if (mPopWindow != null && mPopWindow.isShowing()) {
			mPopWindow.dismiss();
			mPopWindow = null;
		} else {
			showPopupListView();
			setSelected(true);
			mPopWindow.showAsDropDown(this, XOFFSET, 0);
		}
	}

3、最后我们来解决如何将ListView中的item视图依次显示到屏幕上,这个需要使用到一个新的概念layoutAnimation。

首先我们来看一下layoutAnimation如何使用:

在res/anim文件夹下,listview_layout_anim.xml文件,具体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="1"
    android:animationOrder="normal"
    android:animation="@anim/slide_right" ></layoutAnimation>

注意:

1、layoutAnimation标签的首字母是小写

2、android:delay 表示动画的延时,既可以是百分比也可以是float小数

3、android:animationOrder 表示动画播放的书序:有三个取值normal(顺序), reverse(反序), random(随机)、

4、android:animation 指向了子控件所需要播放的动画,slied_right.xml文件代码如下所示:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="500"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />

</set>

listview_layout_anim.xml文件写好之后,就可以在其它xml布局文件中通过android:layoutAnimation属性被引用到,如下代码所示:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lv_popup_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:divider="@color/white"
    android:scrollbars="none"
    android:layoutAnimation="@anim/list_anim_layout"
    android:listSelector="@drawable/btn_pop_sel" />

这样,上面代码中的ListView在屏幕上显示时就会自带动画效果,如下面动态图所示:



了解了如何使用layoutAnimation之后,我们就可以将我们自定义弹出的ListView也设置相应的补间动画即可了^_^


完整代码链接:http://download.csdn.net/detail/zxm317122667/9466705

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值