概述
一、有图有真相
二、如何实现浮动视图?
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 浮动视图效果 第三种实现方式的全部内容,希望文章能够帮你解决Android 浮动视图效果 第三种实现方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复