- 浏览: 129164 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
newhxj:
03-21 10:56:35.850: E/Web Conso ...
Android简易Flash播放器[转] -
roiz:
谢谢 很好正需要这资料
精确监听AbsListView滚动至底部[转]
上次介绍了基础篇,讲解了自定义抽屉控件的基础实现,这次就在基础篇的基础上加入拖拉功能。拖拉功能基于GestureDetector,GestureDetector的基本使用方式不是本文介绍的重点,有兴趣的童鞋可以上网查询相关的教程。
本文的抽屉控件相对于基础篇的抽屉控件多了以下功能:
1.支持手势拖拉
2.拖拉到一半时,可以自动展开或者收缩。
具体如下图:
本文的源码可以到这里下载:http://download.csdn.net/detail/hellogv/3642418
只贴出抽屉组件的源码,其他源文件与基础篇的一样:
public class Panel extends LinearLayout implements GestureDetector.OnGestureListener{ public interface PanelClosedEvent { void onPanelClosed(View panel); } public interface PanelOpenedEvent { void onPanelOpened(View panel); } private final static int HANDLE_WIDTH=30; private final static int MOVE_WIDTH=20; private Button btnHandler; private LinearLayout panelContainer; private int mRightMargin=0; private Context mContext; private GestureDetector mGestureDetector; private boolean mIsScrolling=false; private float mScrollX; private PanelClosedEvent panelClosedEvent=null; private PanelOpenedEvent panelOpenedEvent=null; public Panel(Context context,View otherView,int width,int height) { super(context); this.mContext=context; //定义手势识别 mGestureDetector = new GestureDetector(mContext,this); mGestureDetector.setIsLongpressEnabled(false); //改变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; mRightMargin=Math.abs(lp.rightMargin); this.setLayoutParams(lp); this.setOrientation(LinearLayout.HORIZONTAL); //设置Handler的属性 btnHandler=new Button(context); btnHandler.setLayoutParams(new LayoutParams(HANDLE_WIDTH,height)); //btnHandler.setOnClickListener(handlerClickEvent); btnHandler.setOnTouchListener(handlerTouchEvent); this.addView(btnHandler); //设置Container的属性 panelContainer=new LinearLayout(context); panelContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); this.addView(panelContainer); } private View.OnTouchListener handlerTouchEvent=new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP && //onScroll时的ACTION_UP mIsScrolling==true) { LayoutParams lp=(LayoutParams) Panel.this.getLayoutParams(); if (lp.rightMargin >= (-mRightMargin/2)) {//往左超过一半 new AsynMove().execute(new Integer[] { MOVE_WIDTH });// 正数展开 } else if (lp.rightMargin < (-mRightMargin/2)) {//往右拖拉 new AsynMove().execute(new Integer[] { -MOVE_WIDTH });// 负数收缩 } } return mGestureDetector.onTouchEvent(event); } }; /** * 定义收缩时的回调函数 * @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); } } @Override public boolean onDown(MotionEvent e) { mScrollX=0; mIsScrolling=false; return false; } @Override public boolean onSingleTapUp(MotionEvent e) { 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 });// 负数收缩 return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { mIsScrolling=true; mScrollX+=distanceX; LayoutParams lp=(LayoutParams) Panel.this.getLayoutParams(); if (lp.rightMargin < -1 && mScrollX > 0) {//往左拖拉 lp.rightMargin = Math.min((lp.rightMargin + (int) mScrollX),0); Panel.this.setLayoutParams(lp); Log.e("onScroll",lp.rightMargin+""); } else if (lp.rightMargin > -(mRightMargin) && mScrollX < 0) {//往右拖拉 lp.rightMargin = Math.max((lp.rightMargin + (int) mScrollX),-mRightMargin); Panel.this.setLayoutParams(lp); } if(lp.rightMargin==0 && panelOpenedEvent!=null){//展开之后 panelOpenedEvent.onPanelOpened(Panel.this);//调用OPEN回调函数 } else if(lp.rightMargin==-(mRightMargin) && panelClosedEvent!=null){//收缩之后 panelClosedEvent.onPanelClosed(Panel.this);//调用CLOSE回调函数 } Log.e("onScroll",lp.rightMargin+""); return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {return false;} @Override public void onLongPress(MotionEvent e) {} @Override public void onShowPress(MotionEvent e) {} }
本文来自http://blog.csdn.net/hellogv/article/details/6828584
发表评论
-
android Theme使用总结
2012-12-12 19:22 1426今天对api中style下的theme整个摸了一遍。 ... -
android优化——adapter
2012-12-12 18:56 1470什么是Adapter,可以先看看我的上一篇文章,Andr ... -
listview样式设置——自定义背景、分隔[转]
2012-12-12 14:13 786在Android中,ListView是最常用的一个控件, ... -
draw9patch不失真背景
2012-12-12 00:23 12931.背景自适应且不失真问题的存在 制作自适应背 ... -
android布局之selector(背景选择器)[转]
2012-12-11 23:07 2819关于listview和button都 ... -
android布局之RelativeLayout属性
2012-12-11 23:06 1184android:layout_above ... -
Android ListView下拉刷新点击加载更多[转]
2012-12-03 09:04 1683这个ListView的下拉刷新算是不错了。网上找了很多个 ... -
BitmapFactory.Options详解[转]
2012-11-21 20:50 3282public Bitmap in ... -
Android简易Flash播放器[转]
2012-01-20 21:16 1874上一节,大体说了下在Android程序中嵌套Flash动 ... -
将flash嵌入你的程序中[转]
2012-01-20 21:12 1141无论如何,我们需要一个android2.2的平板电脑 ... -
Android实现ListView异步加载图片[转]
2011-11-30 11:17 684ListView异步加载图片是非常实用的方法,凡是是要通过网络 ... -
精确监听AbsListView滚动至底部[转]
2011-11-10 09:00 1401用户使用android客户端时,当Lis ... -
可动态布局的Android抽屉之基础[转]
2011-11-10 08:59 1566以前曾经介绍过《Android提高第十九篇 ... -
Android提高第二十一篇之MediaPlayer播放网络视频
2011-11-10 08:59 2615上次讲解了MediaPlayer播放网络音 ... -
Android提高第二十篇之MediaPlayer播放网络音频[转]
2011-11-10 08:58 757以前曾经地介绍过MediaPlayer的基本用 ... -
Android提高第十九篇之"多方向"抽屉[转]
2011-11-09 13:35 1173在android上要实现类似Launch的 ... -
Android提高十八篇之自定义Menu(TabMenu)[转]
2011-11-09 13:35 866用过UCWEB-Android版的人都应 ... -
Android提高十七篇之多级树形菜单的实现[转]
2011-11-09 13:35 860在Android里要实现树形菜单,都是用 ... -
Android提高十六篇之使用NDK把彩图转换灰度图[转]
2011-11-09 13:34 1015在Android上使 ... -
Android提高第十五篇之ListView自适应实现表格[转]
2011-11-09 13:34 848上次介绍了使用GridView实现表格, ...
相关推荐
“可动态布局”的Android抽屉组件之完整例子源码
“可动态布局”的Android抽屉组件之构建基础的例子源码
相互挤压的Button 博文链接:https://gundumw100.iteye.com/blog/1183978
android 抽屉(坐上右下都可以设置) 参考下面的链接:http://www.cnblogs.com/bluestorm/p/3716540.html https://pan.baidu.com/s/1c08Esj2
android类似双向抽屉效果实现,如海豚浏览器首页。
android实现抽屉列表,并且各个列表项前加有小图标,代码简单易懂,下载下来即可使用,修改为自己的布局即可使用抽屉效果。
这是我做的一个关于项目管理的程序的Android端,采用抽屉侧边栏(drawerlayout)布局,采用handler机制切换主页面ListVIew的数据,采用http+json获取数据。其中数据统计引入了Android的图表插件。
android studio 抽屉和其他效果
利用 v4包里的DrawerLayout 布局,实现一个 抽屉效果,抽屉内容使用RecyclerView 形成一个列表,当用户选则一项,内容里面跟着发生变化;
里面有DrawerLayout的使用方法和自定义抽屉式侧滑导航栏
谷歌官方推出了一种侧滑菜单的...2、抽屉菜单的摆放和布局通过android:layout_gravity属性来控制,可选值为left、right或start、end。 3、抽屉菜单的宽度为 dp 单位而高度和父View一样。抽屉菜单的宽度应该不超过320
一个Android滑动抽屉,上滑打开,滑下来关闭,也有自动倒带。 支持正常布局,Listview,ScrollView,RecyclerView。
大家可以参考该小项目,看看效果,学习学习,然后自己也可以修改增强一下效果。
VerticalDrawerLayout 一个垂直方向的DrawerLayout,抽屉从上向下展开。布局示例: android:id="@ id/vertical" android:layout_width="match_parent" android:layout_height="match_parent"> ...
默认显示抽屉的一部分,屏幕分上下二部分;通过打开按钮实现,抽屉的下面部分打开和关闭,同时上面部分自动伸展。
仿Uber页面布局-抽屉菜单基本框架 android 侧滑 抽屉 仿Uber UI设计 实现actionBar自定义实现 侧边栏自定义实现
安卓中1.5后加入了SlidingDrawer【隐藏式抽屉】,设计原理在你的UI布局有限的情况下,放不下太多的控件的时候,可以考虑用这个隐藏式抽屉。用SlidingDrawer注意两点,一个是android:handle(委托要展开的图片加载...
Android高手进阶教程之----Android Launcher抽屉类SlidingDrawer的使用.doc Android高手进阶教程之----Android Location的使用!! .doc Android高手进阶教程之----Android PopupWindow的使用!!! .doc Android高手...
安卓多item抽屉动画效果,支持动态添加删除动画。 先看效果: 本文CSDN博客 http://blog.csdn.net/AndroidMsky/article/details/53083634 先解释一下标题不然被说成标题党可不好,为什么是超轻量,因为我知道用...
Android源码之动态壁纸引擎 动态桌面实现 android控件的抖动效果 很漂亮的ListView android 图像处理滤镜 照亮边缘特效 无闪烁启动画面 Android实现《天女散花》效果--(带源码) 天天动听 半透明Menu效果 Android ...