Android 浮动视图效果 第三种实现方式



一、有图有真相



二、如何实现浮动视图?

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);
	}

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();
		
		// 隐藏当前Item
		clickItem.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;
		}
		
		// 显示之前隐藏的选中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



你可能感兴趣的:(Android,窗口与View管理)