android抽屉SlidingDrawer——wrap_content非全屏

本文地址:http://blog.csdn.net/you_and_me12/article/details/7327030

SlidingDrawer的用法比较多,就不说明了。

如果设置了属性layout_height="wrap_content"是不起作用的,在原来的SlidingDrawer中的onMeasure()方法使得layout_height一直都是fill_parent,但是使用layout_height="固定高度"也是可以!

以下重写SlidingDrawer,实现如下效果图(右图效果):

-->

贴代码

[java]  view plain copy print ?
  1. /** 
  2.  * 使得SlidingDrawer在屏幕低端,而不会填满整个屏幕 
  3.  * @author akai 2012-03-06 
  4.  */  
  5. public class WrapSlidingDrawer extends SlidingDrawer {  
  6.     private boolean mVertical;  
  7.     private int mTopOffset;  
  8.       
  9.     public WrapSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.         int orientation = attrs.getAttributeIntValue("android""orientation", ORIENTATION_VERTICAL);  
  12.         mTopOffset = attrs.getAttributeIntValue("android""topOffset"0);  
  13.         mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);  
  14.     }  
  15.   
  16.     public WrapSlidingDrawer(Context context, AttributeSet attrs) {  
  17.         super(context, attrs);  
  18.         int orientation = attrs.getAttributeIntValue("android""orientation", ORIENTATION_VERTICAL);  
  19.         mTopOffset = attrs.getAttributeIntValue("android""topOffset"0);  
  20.         mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  25.         int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);  
  26.         int widthSpecSize =  MeasureSpec.getSize(widthMeasureSpec);  
  27.         int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);  
  28.         int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);  
  29.   
  30.         final View handle = getHandle();  
  31.         final View content = getContent();  
  32.         measureChild(handle, widthMeasureSpec, heightMeasureSpec);  
  33.   
  34.         if (mVertical) {  
  35.             int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset;  
  36.             content.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, heightSpecMode));  
  37.             heightSpecSize = handle.getMeasuredHeight() + mTopOffset + content.getMeasuredHeight();  
  38.             widthSpecSize = content.getMeasuredWidth();  
  39.             if (handle.getMeasuredWidth() > widthSpecSize) widthSpecSize = handle.getMeasuredWidth();  
  40.         }  
  41.         else {  
  42.             int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset;  
  43.             getContent().measure(MeasureSpec.makeMeasureSpec(width, widthSpecMode), heightMeasureSpec);  
  44.             widthSpecSize = handle.getMeasuredWidth() + mTopOffset + content.getMeasuredWidth();  
  45.             heightSpecSize = content.getMeasuredHeight();  
  46.             if (handle.getMeasuredHeight() > heightSpecSize) heightSpecSize = handle.getMeasuredHeight();  
  47.         }  
  48.   
  49.         setMeasuredDimension(widthSpecSize, heightSpecSize);  
  50.     }  
  51. }  

注释:本代码可以直接使用,不需修改,使用是把原来的<SlidingDrawer>标签修改为<packageName.WrapSlidingDrawer>即可。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值