一、有图有真相



二、如何实现浮动视图?

1. 使用WindowManager达到浮动视图效果。《Android 可移动悬浮窗口 WindowManager》

2. Android UI是树级结构,可以是同级视图一个在上面一个在下面,例如:《Android 滑动菜单(Sliding Menu)实现分析》中的布局方式。也可以是上级视图。

3. 当前实现方式,画出一个视图达到浮动效果。之前虽然也学习过Canvas知道可以绘制出图形,但是这种浮动视图实现效果还是很震惊。

3.1. 使用View的属性把想要达到浮动效果的视图转换成Bitmap,具体可以看下《Android 把视图转换为图片,截取屏幕》。

3.2 创建ImageView并设置Bitmap。

3.3 重新对创建的ImageView 进行Measure,Layout操作,之后在dispatchDraw中把想要浮动的视图绘制出来。


当前例子是使用ListView演示效果,ListView本身是ViewGroup子类,只要是ViewGroup子类都可以通过这种方式实现浮动视图效果。


三、伪代码

1. 自定义ListView,先来看看触发显示浮动视图的地方。如果创建ListView这里就不再解释了。

@Overridepublic boolean onTouchEvent(MotionEvent event) {final int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// 按下的时候显示浮动视图showFloatView(event);break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:// 抬起时清除浮动视图destroyFloatView();break;}return super.onTouchEvent(event);}

2. 以上在DOWN事件是显示浮动视图,UP事件时隐藏浮动视图,现在来看看如何实现显示浮动视图的

/** * 显示浮动视图 *  * @param event */private void showFloatView(MotionEvent event) {// 通过坐标获取指定选中的Item的位置mSelectedPosition = pointToPosition((int)event.getX(), (int)event.getY());if (mSelectedPosition == MISS) {return;}// 当前触摸的Item视图View clickItem = getChildAt(mSelectedPosition);if (clickItem == null) {return;}// 转换为图片clickItem.setDrawingCacheEnabled(true);mSelectedItemBitmap = Bitmap.createBitmap( clickItem.getDrawingCache() );clickItem.setDrawingCacheEnabled(false);// 创建浮动视图if (mFloatView == null) {mFloatView = new ImageView(getContext());}mFloatView.setPadding(0, 0, 0, 0);mFloatView.setImageBitmap(mSelectedItemBitmap);mFloatView.setLayoutParams(new LayoutParams(clickItem.getWidth(), clickItem.getHeight()));measureFloatView();// 隐藏当前ItemclickItem.setVisibility(View.INVISIBLE);// 使以上设置生效requestLayout();}

3. 销毁浮动视图

/** * 注销浮动视图 */private void destroyFloatView() {if (mFloatView != null) {mFloatView.setVisibility(View.GONE);// 销毁Bitmap,不注意回收容易出现内存溢出if (mSelectedItemBitmap != null) {mSelectedItemBitmap.recycle();mSelectedItemBitmap = null;}mFloatView = null;}// 显示之前隐藏的选中Itemif (mSelectedPosition != MISS) {View selectedItem = getChildAt(mSelectedPosition);if (selectedItem != null) {selectedItem.setVisibility(View.VISIBLE);}}mSelectedPosition = MISS;invalidate();}



四、源码下载

点击下载源码


转载请注明出处:http://blog.csdn.net/love_world_/article/details/8816176



更多相关文章

  1. Android(安卓)density与显示效果总结
  2. android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K
  3. android学习笔记之AIDL
  4. Android基于API的Tabs3实现仿优酷tabhost效果实例
  5. Android(安卓)使WebView支持HTML5 Video(全屏)播放的方法
  6. Android视图大小测量案例研究
  7. android动效开篇
  8. Android——自定义Toast(含源码下载)
  9. 学习使用DrawerLayout

随机推荐

  1. Android(安卓)Framework---themes.xml
  2. android setPersistent
  3. android截屏
  4. android 调用摄像头
  5. adt或eclipse中Android工程如何互相引用
  6. Android(安卓)SeekBar(拖动条)
  7. Android(安卓)WebView文件上传(关键代码)
  8. Android学习札记37:onSaveInstanceState (
  9. Android库. 1 UDP客户端
  10. Android(安卓)打开软键盘