一、有图有真相



二、如何实现浮动视图?

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. Ubuntu中手动安装配置JDK, Android(安卓)
  2. 如何让 android 完全退出
  3. Android数据库开源框架GreenDao分析
  4. Android(安卓)默认AP名字,以及AP名字存储
  5. android 监听手机电量变化
  6. android 3D-纹理------球的纹理
  7. 解决Android(安卓)sdk manager无法访问go
  8. spring mvc + mybatis 构建 cms 内容发布
  9. Android为ListView的Item设置不同的布局
  10. Android快速开发工具:AndroidAnnotations: