自定义控件:抽屉SlidingDrawer——wrap_content非全屏

android:allowSingleTap   指示抽屉是否可以打开/通过手柄上的一个水龙头关闭。

android:animateOnClick  表示所述抽屉是否应该打开/与当用户点击手柄动画关闭。      

android:bottomOffset     额外偏移的把手在SlidingDrawer的底部。
android:content   标识符表示抽屉的内容孩子。

Identifier for the child that represents the drawer‘s content. 
android:handle     标识符表示抽屉的把手的孩子。

Identifier for the child that represents the drawer‘s handle.
android:orientation

Orientation of the SlidingDrawer.  取向SlidingDrawer的。
android:topOffset

Extra offset for the handle at the top of the SlidingDrawer.

额外偏移的把手在SlidingDrawer的顶部。

3 import android.content.Context;
  4 import android.util.AttributeSet;
  5 import android.view.View;
  6 import android.widget.SlidingDrawer;
  7
  8 /**
  9  * 使得SlidingDrawer在屏幕低端,而不会填满整个屏幕
 10  */
 11 public class WrapSlidingDrawer extends SlidingDrawer {
 12
 13     private boolean mVertical;
 14     private int mTopOffset;
 15
 16     // 从指定的XML定义的属性集创建一个新的WrapSlidingDrawer。
 17     public WrapSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
 18         super(context, attrs, defStyle);
 19         /**
 20          * namespace     属性的命名空间来获取。
 21          * attribute     属性检索。
 22          * defaultValue     如果未找到该属性返回什么。
 23          *
 24          * ORIENTATION_VERTICAL:定向垂直。
 25          */
 26         int orientation = attrs.getAttributeIntValue("android", "orientation",
 27                 ORIENTATION_VERTICAL);
 28         // "topOffset" 额外偏移的把手在SlidingDrawer的顶部。
 29         mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
 30         mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
 31     }
 32
 33     public WrapSlidingDrawer(Context context, AttributeSet attrs) {
 34         super(context, attrs);
 35         int orientation = attrs.getAttributeIntValue("android", "orientation",
 36                 ORIENTATION_VERTICAL);
 37         mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
 38         mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
 39     }
 40
 41     /**
 42      * 测量视图和其内容,以确定所测量的宽度和所测量的高度。
 43      * widthMeasureSpec   宽度测量规格。
 44      * heightMeasureSpec  高度测量规格。
 45      */
 46     @Override
 47     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 48         int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
 49         int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
 50         int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
 51         int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
 52         // 返回抽屉的手柄。
 53         final View handle = getHandle();
 54         // 返回抽屉的内容。
 55         final View content = getContent();
 56         /**
 57          * Ask one of the children of this view to measure itself, taking into
 58          * account both the MeasureSpec requirements for this view and its padding.
 59          * The heavy lifting is done in getChildMeasureSpec.
 60          *
 61          * @param child The child to measure
 62          * @param parentWidthMeasureSpec The width requirements for this view
 63          * @param parentHeightMeasureSpec The height requirements for this view
 64          */
 65         measureChild(handle, widthMeasureSpec, heightMeasureSpec);
 66
 67         if (mVertical) {
 68             // 测量高度 - 抽屉手柄高度 - 额外偏移的把手顶部
 69             int height = heightSpecSize - handle.getMeasuredHeight()
 70                     - mTopOffset;
 71             // 内容尺寸
 72             // public static int makeMeasureSpec (int size, int mode)
 73             // Creates a measure specification based on the supplied size and mode.
 74             //   size    the size of the measure specification
 75             //   mode    the mode of the measure specification
 76             content.measure(widthMeasureSpec,
 77                     MeasureSpec.makeMeasureSpec(height, heightSpecMode));
 78             //
 79             heightSpecSize = handle.getMeasuredHeight() + mTopOffset
 80                     + content.getMeasuredHeight();
 81             //
 82             widthSpecSize = content.getMeasuredWidth();
 83             //
 84             if (handle.getMeasuredWidth() > widthSpecSize)
 85                 widthSpecSize = handle.getMeasuredWidth();
 86         } else {
 87             int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset;
 88             getContent().measure(
 89                     MeasureSpec.makeMeasureSpec(width, widthSpecMode),
 90                     heightMeasureSpec);
 91             widthSpecSize = handle.getMeasuredWidth() + mTopOffset
 92                     + content.getMeasuredWidth();
 93             heightSpecSize = content.getMeasuredHeight();
 94             if (handle.getMeasuredHeight() > heightSpecSize)
 95                 heightSpecSize = handle.getMeasuredHeight();
 96         }
 97         // 此方法必须由onMeasure(int,int)被调用储存的测量宽度和高度测量。
 98         setMeasuredDimension(widthSpecSize, heightSpecSize);
 99     }
100 }
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent" >
 5
 6     <TextView
 7         android:id="@+id/text_view"
 8         android:layout_width="fill_parent"
 9         android:layout_height="wrap_content"
10         android:layout_marginTop="10dip"
11         android:gravity="center"
12         android:text="AAAAAAAAAAAAAA"
13         android:textSize="10pt" />
14
15     <com.cn.daming.WrapSlidingDrawer
16         android:id="@+id/sliding_drawer"
17         android:layout_width="fill_parent"
18         android:layout_height="wrap_content"
19         android:content="@+id/mycontent"
20         android:handle="@+id/layout1"
21         android:layout_alignParentBottom="true"
22         android:orientation="vertical" >
23
24         <LinearLayout
25             android:id="@id/layout1"
26             android:layout_width="wrap_content"
27             android:layout_height="wrap_content"
28             android:background="#00000000"
29             android:gravity="center" >
30
31             <ImageView
32                 android:id="@+id/my_image"
33                 android:layout_width="wrap_content"
34                 android:layout_height="wrap_content"
35                 android:src="@drawable/up1" />
36         </LinearLayout>
37
38         <GridView
39             android:id="@id/mycontent"
40             android:layout_width="wrap_content"
41             android:layout_height="wrap_content"
42             android:background="#ff000000"
43             android:gravity="center"
44             android:numColumns="3"
45             android:paddingTop="20dip" />
46     </com.cn.daming.WrapSlidingDrawer>
47
48 </RelativeLayout>

 3 import android.app.Activity;
 4 import android.content.res.Configuration;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.GridView;
 8 import android.widget.ImageView;
 9 import android.widget.SlidingDrawer;
10 import android.widget.TextView;
11
12 public class SlidingDrawerMainActivity extends Activity {
13
14     private GridView gridView;
15     private SlidingDrawer slidingDrawer;
16     private ImageView imageView;
17     private TextView textview;
18     private int[] icons = { R.drawable.title1, R.drawable.title2,
19             R.drawable.title3, R.drawable.title4, R.drawable.title5,
20             R.drawable.title6 };
21
22     private String[] items = { "Phone", "Message", "AddImage", "Music",
23             "Telephone", "SMS" };
24
25     @Override
26     public void onCreate(Bundle savedInstanceState) {
27         super.onCreate(savedInstanceState);
28
29         setContentView(R.layout.main);
30
31         gridView = (GridView) findViewById(R.id.mycontent);
32         slidingDrawer = (SlidingDrawer) findViewById(R.id.sliding_drawer);
33         imageView = (ImageView) findViewById(R.id.my_image);
34         textview = (TextView) findViewById(R.id.text_view);
35         MyGridViewAdapter adapter = new MyGridViewAdapter(this, items, icons);
36         gridView.setAdapter(adapter);
37
38         slidingDrawer
39                 .setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {
40
41                     public void onDrawerOpened() {
42                         textview.setVisibility(View.GONE);
43                         imageView.setImageResource(R.drawable.down1);
44                     }
45                 });
46         slidingDrawer
47                 .setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {
48
49                     public void onDrawerClosed() {
50                         textview.setVisibility(View.VISIBLE);
51                         imageView.setImageResource(R.drawable.up1);
52                     }
53                 });
54     }
55
56     @Override
57     public void onConfigurationChanged(Configuration newConfig) {
58         super.onConfigurationChanged(newConfig);
59     }
60 }

完整代码下载:http://pan.baidu.com/s/1sjsdqTv

时间: 2024-10-28 23:39:57

自定义控件:抽屉SlidingDrawer——wrap_content非全屏的相关文章

Android Ireader的全屏与非全屏的切换效果实现

ireader在全屏与非全屏切换,整体的阅读view并没有进行明显示的重绘与抖动现像,如果只是单纯的设置activity的全屏与非全屏切换,因为view的大小变动,会有抖动现象出现 而Android只在4.4版本才提供了沉浸式状态拦,而在4.4之前怎么办呢 1.首先直接在AndroidManifest.xml中需要全屏显示的Activity属性中添加 1 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 2.设置act

(转) Android 全屏控制:动态切换全屏和非全屏

转自:http://blog.csdn.net/michaelpp/article/details/7302308 动态切换全屏和非全屏: package com.screen;   import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.view.WindowManager;  import android.view.View.OnClickListen

Unity发布的WebGL页面应用实现全屏/非全屏切换

很简单,在场景中添加一个UGUI按钮,实现点击就切换全屏/非全屏状态 其实发布出webgl之后,页面上场景窗口右下会有一个按钮,就是切换全屏的,但是想用代码在程序里实现 首先看页面上那个按钮的js脚本是怎么写的 <div class="fullscreen" onclick="gameInstance.SetFullscreen(1)"></div> 注意里面的代码就一行: gameInstance.SetFullscreen(1); 也就是

Chromium为视频标签&lt;video&gt;全屏播放的过程分析

在Chromium中,<video>标签有全屏和非全屏两种播放模式.在非全屏模式下,<video>标签播放的视频嵌入在网页中显示,也就是视频画面作为网页的一部分显示.在全屏模式下,我们是看不到网页其它内容的,因此<video>标签播放的视频可以在一个独立的全屏窗口中显示.这两种截然不同的播放模式,导致Chromium使用不同的方式渲染视频画面.本文接下来就详细分析<video>标签全屏播放的过程. 从前面Chromium为视频标签<video>渲

如何制作一个完美的全屏视频H5

写在前面的话: 最近一波H5广告火爆整个互联网圈,身为圈内人,我们怎能     不! 知!道! :( 嘘!真不知道的也继续看下去,有收获 ↓ ) So,搞懂这个并不难. 这篇文章将带你从头到尾了解H5广告的实现. 本文主要讲一下几个关键点 一.视频内联播放.        -- 想要营造一种文字与视频混排的现象,视频不要影响其他模块 二.视频去控件.  -- 交互视频,不能点击快/慢进或暂停哦 三.去控件全屏播放. -- 想要模拟 明星给我打电话的体验,不能看到明显的视频播放器 四.视频自动播放

运行全屏程序自动切回桌面的问题

最近遇到的问题,运行全屏程序,比如游戏·视频等,每隔一段时间自动切回到桌面,运行其他非全屏程序会失去当前焦点,比如窗口变灰.百度了很多,查看任务计划,兼容性,注册表等等,都没解决.最后利用排除法,一个个kill进程,最后测试出一个进程QQprotect.exe,有它在,就出这问题,kill掉它,完美解决.这是个腾讯qq的安全保护进程,运行qq必备,联系了客服,客服说给反馈,等吧.目前qq7.2版本,7.3版本都有这个问题,不知道是我的个案还是通病,win7  32位系统.排除病毒,其他插件问题.

VirtualBox全屏切换

用VirtualBox的时候,如果设置为全屏,想再切换回来,没有什么菜单,只有通过键盘的快捷键来操作,才可以恢复. 我常常忘掉,所以老是得去找,以后需要记住这几个按键的快捷键. 1.全屏与非全屏切换:Ctrl+F, 需要注意是右手边的Ctrl键2.另外,还有其他几个可以记住: 切换到全屏模式:Ctrl + F切换到无缝模式:Ctrl + L切换到比例模式:Ctrl + C显示控制菜单 :Ctrl + Home 记住,一定是右边的 Ctrl

关于全屏显示问题处理

window.isflsgrn=false;//IE11以下是否进入全屏标志,True为全屏状态,false为非全屏状态 window.ieIsfSceen=false;//IE11是否进入全屏标志,true为全屏状态,false为非全屏状态 //跨浏览器返回当前 document是否进入了可以请求全屏模式的状态 function fullscreenEnable(){ var isFullscreen=document.fullscreenEnabled||window.fullScreen|

android 软键盘在全屏下的布局计算问题

在非全屏模式下,将activity的windowSoftInputMode的属性设置为:adjustResize.同时在View的onSizeChanged(int w, int h, int oldw, int oldh)里可以得到变化后的尺寸,然后根据前后变化的结果来计算屏幕需要移动的距离. 但是在全屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize.在键盘显示时它未将Activity的Screen向上推动,所以你Activity的