一、有图有真相
二、如何实现浮动视图?
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这里就不再解释了。
@Override public 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); }
/** * 显示浮动视图 * * @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(); // 隐藏当前Item clickItem.setVisibility(View.INVISIBLE); // 使以上设置生效 requestLayout(); }
/** * 注销浮动视图 */ private void destroyFloatView() { if (mFloatView != null) { mFloatView.setVisibility(View.GONE); // 销毁Bitmap,不注意回收容易出现内存溢出 if (mSelectedItemBitmap != null) { mSelectedItemBitmap.recycle(); mSelectedItemBitmap = null; } mFloatView = null; } // 显示之前隐藏的选中Item if (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