您的位置:首页 > 移动开发 > Android开发

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

2013-04-17 21:37 483 查看
一、有图有真相



二、如何实现浮动视图?

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: