- 浏览: 133172 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
newhxj:
03-21 10:56:35.850: E/Web Conso ...
Android简易Flash播放器[转] -
roiz:
谢谢 很好正需要这资料
精确监听AbsListView滚动至底部[转]
以前曾经介绍过《Android提高第十九篇之"多方向"抽屉》,当这个抽屉组件不与周围组件发生压挤的情况下(周围组件布局不变),是比较好使的,但是如果需要对周围组件挤压,则用起来欠缺美观了。
如下图。在对周围压挤的情况下,抽屉是先把周围的组件一次性压挤,再通过动画效果展开/收缩的,这种做法的好处是快速简单,坏处是如果挤压范围过大,则效果生硬。
本文实现的自定义抽屉组件,主要针对这种压挤效果做出改良,渐进式压挤周围组件,使得过渡效果更加美观。如下图。
本文实现的抽屉原理是酱紫:
1.抽屉组件主要在屏幕不可视区域,手柄在屏幕边缘的可视区域。即 抽屉.rightMargin=-XXX + 手柄.width
2.指定一个周围组件为可压挤,即LayoutParams.weight=1;当然用户也可以指定多个View.
3.使用AsyncTask来实现弹出/收缩的动画,弹出:抽屉.rightMargin+=XX,收缩:抽屉.rightMargin-=XX
总结,本文的自定义抽屉虽然对压挤周围组件有过渡效果,但是比较耗资源,读者可以针对不同的情况考虑使用。
本文的源码可以到http://download.csdn.net/detail/hellogv/3615686 下载。
接下来贴出本文全部源代码:
main.xml的源码:
<span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/container"> <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:gravity="center" android:columnWidth="50dip" android:horizontalSpacing="10dip" /> </LinearLayout></span>
GridView的Item.xml的源码:
<span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="4dip" android:layout_width="fill_parent"> <ImageView android:layout_height="wrap_content" android:id="@+id/ItemImage" android:layout_width="wrap_content" android:layout_centerHorizontal="true"> </ImageView> <TextView android:layout_width="wrap_content" android:layout_below="@+id/ItemImage" android:layout_height="wrap_content" android:text="TextView01" android:layout_centerHorizontal="true" android:id="@+id/ItemText"> </TextView> </RelativeLayout> </span>
Panel.java是本文核心,抽屉组件的源码,这个抽屉只实现了从右往左的弹出/从左往右的收缩,读者可以根据自己的需要修改源码来改变抽屉动作的方向:
public class Panel extends LinearLayout{ public interface PanelClosedEvent { void onPanelClosed(View panel); } public interface PanelOpenedEvent { void onPanelOpened(View panel); } /**Handle的宽度,与Panel等高*/ private final static int HANDLE_WIDTH=30; /**每次自动展开/收缩的范围*/ private final static int MOVE_WIDTH=20; private Button btnHandle; private LinearLayout panelContainer; private int mRightMargin=0; private Context mContext; private PanelClosedEvent panelClosedEvent=null; private PanelOpenedEvent panelOpenedEvent=null; /** * otherView自动布局以适应Panel展开/收缩的空间变化 * @author GV * */ public Panel(Context context,View otherView,int width,int height) { super(context); this.mContext=context; //改变Panel附近组件的属性 LayoutParams otherLP=(LayoutParams) otherView.getLayoutParams(); otherLP.weight=1;//支持压挤 otherView.setLayoutParams(otherLP); //设置Panel本身的属性 LayoutParams lp=new LayoutParams(width, height); lp.rightMargin=-lp.width+HANDLE_WIDTH;//Panel的Container在屏幕不可视区域,Handle在可视区域 mRightMargin=Math.abs(lp.rightMargin); this.setLayoutParams(lp); this.setOrientation(LinearLayout.HORIZONTAL); //设置Handle的属性 btnHandle=new Button(context); btnHandle.setLayoutParams(new LayoutParams(HANDLE_WIDTH,height)); btnHandle.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams(); if (lp.rightMargin < 0)// CLOSE的状态 new AsynMove().execute(new Integer[] { MOVE_WIDTH });// 正数展开 else if (lp.rightMargin >= 0)// OPEN的状态 new AsynMove().execute(new Integer[] { -MOVE_WIDTH });// 负数收缩 } }); //btnHandle.setOnTouchListener(HandleTouchEvent); this.addView(btnHandle); //设置Container的属性 panelContainer=new LinearLayout(context); panelContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); this.addView(panelContainer); } /** * 定义收缩时的回调函数 * @param event */ public void setPanelClosedEvent(PanelClosedEvent event) { this.panelClosedEvent=event; } /** * 定义展开时的回调函数 * @param event */ public void setPanelOpenedEvent(PanelOpenedEvent event) { this.panelOpenedEvent=event; } /** * 把View放在Panel的Container * @param v */ public void fillPanelContainer(View v) { panelContainer.addView(v); } /** * 异步移动Panel * @author hellogv */ class AsynMove extends AsyncTask<Integer, Integer, Void> { @Override protected Void doInBackground(Integer... params) { int times; if (mRightMargin % Math.abs(params[0]) == 0)// 整除 times = mRightMargin / Math.abs(params[0]); else // 有余数 times = mRightMargin / Math.abs(params[0]) + 1; for (int i = 0; i < times; i++) { publishProgress(params); try { Thread.sleep(Math.abs(params[0])); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... params) { LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams(); if (params[0] < 0) lp.rightMargin = Math.max(lp.rightMargin + params[0], (-mRightMargin)); else lp.rightMargin = Math.min(lp.rightMargin + params[0], 0); if(lp.rightMargin==0 && panelOpenedEvent!=null){//展开之后 panelOpenedEvent.onPanelOpened(Panel.this);//调用OPEN回调函数 } else if(lp.rightMargin==-(mRightMargin) && panelClosedEvent!=null){//收缩之后 panelClosedEvent.onPanelClosed(Panel.this);//调用CLOSE回调函数 } Panel.this.setLayoutParams(lp); } } }
main.java是主控部分,演示了Panel的使用:
public class main extends Activity { public Panel panel; public LinearLayout container; public GridView gridview; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("“可动态布局”的抽屉组件之构建基础-----hellogv"); gridview = (GridView) findViewById(R.id.gridview); container=(LinearLayout)findViewById(R.id.container); panel=new Panel(this,gridview,200,LayoutParams.FILL_PARENT); container.addView(panel);//加入Panel控件 //新建测试组件 TextView tvTest=new TextView(this); tvTest.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); tvTest.setText("测试组件,红字白底"); tvTest.setTextColor(Color.RED); tvTest.setBackgroundColor(Color.WHITE); //加入到Panel里面 panel.fillPanelContainer(tvTest); panel.setPanelClosedEvent(panelClosedEvent); panel.setPanelOpenedEvent(panelOpenedEvent); //往GridView填充测试数据 ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 100; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.icon); map.put("ItemText", "NO." + String.valueOf(i)); lstImageItem.add(map); } SimpleAdapter saImageItems = new SimpleAdapter(this, lstImageItem, R.layout.item, new String[] { "ItemImage", "ItemText" }, new int[] { R.id.ItemImage, R.id.ItemText }); gridview.setAdapter(saImageItems); gridview.setOnItemClickListener(new ItemClickListener()); } PanelClosedEvent panelClosedEvent =new PanelClosedEvent(){ @Override public void onPanelClosed(View panel) { Log.e("panelClosedEvent","panelClosedEvent"); } }; PanelOpenedEvent panelOpenedEvent =new PanelOpenedEvent(){ @Override public void onPanelOpened(View panel) { Log.e("panelOpenedEvent","panelOpenedEvent"); } }; class ItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0,View arg1, int arg2, long arg3) { @SuppressWarnings("unchecked") HashMap<String, Object> item = (HashMap<String, Object>) arg0 .getItemAtPosition(arg2); setTitle((String) item.get("ItemText")); } }
本文来自http://blog.csdn.net/hellogv/article/details/6789698
发表评论
-
android Theme使用总结
2012-12-12 19:22 1490今天对api中style下的theme整个摸了一遍。 ... -
android优化——adapter
2012-12-12 18:56 1505什么是Adapter,可以先看看我的上一篇文章,Andr ... -
listview样式设置——自定义背景、分隔[转]
2012-12-12 14:13 822在Android中,ListView是最常用的一个控件, ... -
draw9patch不失真背景
2012-12-12 00:23 13241.背景自适应且不失真问题的存在 制作自适应背 ... -
android布局之selector(背景选择器)[转]
2012-12-11 23:07 2852关于listview和button都 ... -
android布局之RelativeLayout属性
2012-12-11 23:06 1233android:layout_above ... -
Android ListView下拉刷新点击加载更多[转]
2012-12-03 09:04 1707这个ListView的下拉刷新算是不错了。网上找了很多个 ... -
BitmapFactory.Options详解[转]
2012-11-21 20:50 3316public Bitmap in ... -
Android简易Flash播放器[转]
2012-01-20 21:16 1942上一节,大体说了下在Android程序中嵌套Flash动 ... -
将flash嵌入你的程序中[转]
2012-01-20 21:12 1222无论如何,我们需要一个android2.2的平板电脑 ... -
Android实现ListView异步加载图片[转]
2011-11-30 11:17 729ListView异步加载图片是非常实用的方法,凡是是要通过网络 ... -
精确监听AbsListView滚动至底部[转]
2011-11-10 09:00 1445用户使用android客户端时,当Lis ... -
可动态布局的Android抽屉之完整篇[转]
2011-11-10 09:00 1108上次介绍了基础篇,讲解了自定义抽屉控件的基 ... -
Android提高第二十一篇之MediaPlayer播放网络视频
2011-11-10 08:59 2640上次讲解了MediaPlayer播放网络音 ... -
Android提高第二十篇之MediaPlayer播放网络音频[转]
2011-11-10 08:58 789以前曾经地介绍过MediaPlayer的基本用 ... -
Android提高第十九篇之"多方向"抽屉[转]
2011-11-09 13:35 1203在android上要实现类似Launch的 ... -
Android提高十八篇之自定义Menu(TabMenu)[转]
2011-11-09 13:35 901用过UCWEB-Android版的人都应 ... -
Android提高十七篇之多级树形菜单的实现[转]
2011-11-09 13:35 896在Android里要实现树形菜单,都是用 ... -
Android提高十六篇之使用NDK把彩图转换灰度图[转]
2011-11-09 13:34 1059在Android上使 ... -
Android提高第十五篇之ListView自适应实现表格[转]
2011-11-09 13:34 873上次介绍了使用GridView实现表格, ...
相关推荐
本篇将深入探讨如何创建一个可动态布局的Android抽屉组件,提供一个完整的实现案例源码。 首先,抽屉组件的基本概念:DrawerLayout是Android提供的一个视图容器,它可以包含两个主要区域——主内容视图和一个或多个...
总之,构建一个支持动态布局的Android抽屉组件,需要对Android的基础组件有深入理解,尤其是`DrawerLayout`的用法,以及如何在运行时动态修改布局。ExPanel(1)作为一个示例,为我们提供了一种可能的实现方式,通过...
`<android.support.v4.widget.DrawerLayout>` 作为根元素,包含主布局和抽屉布局。抽屉视图使用 `android:layout_gravity` 属性来定位,如 "start" 或 "end" 表示从左侧或右侧滑出。 6. **数据绑定和菜单项点击事件...
在Android开发中,"可左右两侧挤压傍边布局的Android抽屉"是一种常见的设计模式,通常用于实现侧滑菜单效果。这种布局允许用户从屏幕的边缘向内滑动,显示隐藏的内容,比如导航选项或者更多功能。在Android的UI设计...
首先,Android抽屉的实现主要依赖于`SlidingDrawer`组件(尽管在较新的API级别中已被弃用)或者`NavigationView`结合`DrawerLayout`。在这个案例中,`slidingdrawer`可能是指一个包含实现抽屉功能的源代码文件。`...
总的来说,通过Android的属性动画,我们可以轻松实现旋转抽屉菜单的动态效果,这不仅可以提升应用的视觉吸引力,还能增强用户的交互体验。在实际开发中,应结合具体需求和设备性能灵活运用,以达到最佳效果。
通过以上步骤,你可以创建一个具有上下伸缩和展开效果的Android抽屉下拉菜单。这个过程中,不断优化用户体验,让交互更加自然流畅,是提升应用品质的关键。同时,持续学习和分享新的实现方式,也是提升个人技能的...
总的来说,Android抽屉结合`Fragment`是一种常见的应用设计模式,它提供了良好的用户体验和高效的导航结构。开发者需要熟悉`NavigationView`和`DrawerLayout`的使用,以及如何与`Fragment`协作,才能实现流畅的抽屉...
首先,我们需要了解Android的`DrawerLayout`组件,它是实现抽屉效果的基础。`DrawerLayout`是Android SDK中的一个布局容器,它可以容纳一个或两个抽屉视图,通常是从屏幕左侧或右侧滑出。在XML布局文件中,你可以将...
以上就是关于“android抽屉组件实例”的核心知识点。通过学习和实践这个实例,初学者不仅可以掌握抽屉组件的基本用法,还能进一步理解Android布局和事件处理机制,为今后的Android开发打下坚实的基础。记得在实际...
在Android应用开发中,抽屉效果(DrawerLayout)是一种常见的设计模式,用于...以上就是关于Android抽屉效果实现的基本知识和步骤。在实际项目中,你可能需要根据具体需求进行调整,例如添加动画效果、定制菜单样式等。
Android抽屉效果的核心组件是`NavigationView`和`DrawerLayout`,它们是Android SDK中的两个关键布局组件。 1. **NavigationView**: 这是一个用于创建侧滑菜单的视图组件。它可以显示一个包含头像、用户名、菜单项...
描述中的"android多方向抽屉drawer,上下左右均可"表明我们将关注如何实现一个可以沿着屏幕四个边界的抽屉。在Android中,虽然官方的`android.widget.SlidingDrawer`类已经被废弃,但开发者仍然可以通过自定义视图...
在Android应用开发中,下拉抽屉(Pull Down Drawer)是一种常见的交互设计,它通常用于显示侧滑菜单或隐藏的功能选项。在Android4.4(KitKat)版本中,谷歌引入了新的设计指南和组件,使得实现这样的效果更加便捷。...
总的来说,这个“android抽屉效果源码”是一个很好的学习资源,它涵盖了Android手势检测、视图动画、自定义布局等多个关键知识点。通过分析和运行这个示例,开发者可以深入理解Android滑动抽屉的实现原理,并将其...
这个从gitHub上整理的Android抽屉效果项目,涵盖了左滑、右滑、上滑和下滑等多种交互方式,为开发者提供了实现各种菜单效果的工具。 首先,我们来了解一下抽屉布局的基本概念。抽屉布局(DrawerLayout)是Android ...
滑动抽屉通常包含在一个Activity的布局文件中,利用`android.support.v4.widget.DrawerLayout`作为根视图。`DrawerLayout`是Android支持库的一部分,用于实现这种侧滑菜单效果。它可以承载两个子视图:主要内容视图...
在Android应用开发中,抽屉(Drawer)效果是一种常见的交互设计,它允许用户从屏幕边缘滑动出一个可隐藏的菜单或内容区域,类似于现实生活中的抽屉。这种效果在许多应用中都有应用,如Google Maps、Facebook等,而...
以上就是使用`DrawerLayout`和`RecyclerView`实现Android抽屉效果的基本流程。实际开发中,你可能还需要根据具体需求进行调整,比如添加自定义头部视图、实现下拉刷新等高级功能。熟练掌握这些组件的使用,能帮助...