package com.freelib.multiitem.helper;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
/**
* 拖动时浮动Item视图辅助类
* 浮动视图采用WindowManager + ImageView展示被拖动Item视图生成的Bitmap
* Created by free46000 on 2017/4/1.
*/
public class DragFloatViewHelper {
private View currTouchedView;
private WindowManager manager;
private WindowManager.LayoutParams params;
private int offsetX;
private int offsetY;
/**
* 创建浮层view
*
* @param coverView 被覆盖的view,用于计算浮层位置
* @param scale 缩放比例
*/
public void createView(View coverView, float touchRawX, float touchRawY, float scale) {
currTouchedView = createFloatView(coverView);
manager = (WindowManager) currTouchedView.getContext().getSystemService(
Context.WINDOW_SERVICE);
params = initParams(currTouchedView);
params.width = (int) (coverView.getWidth() * scale);//窗口的宽和高
params.height = (int) (coverView.getHeight() * scale);
int[] location = getLocation(coverView);
params.x = location[0];//窗口位置的偏移量
params.y = location[1];
manager.addView(currTouchedView, params);
offsetX = (int) (touchRawX - location[0]);
offsetY = (int) (touchRawY - location[1]);
}
/**
* @param coverView 被覆盖的view,用于生产浮层View
* @return 需要跟随手势浮动的 View
*/
protected View createFloatView(View coverView) {
ImageView floatView = new ImageView(coverView.getContext());
coverView.destroyDrawingCache();
coverView.setDrawingCacheEnabled(true);
Bitmap bitmap = coverView.getDrawingCache();
if (bitmap != null && !bitmap.isRecycled()) {
floatView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
floatView.setImageBitmap(bitmap);
}
return floatView;
}
/**
* @return 需要跟随手势浮动的 View
*/
public View getFloatView() {
return currTouchedView;
}
protected int[] getLocation(View coverView) {
int[] result = new int[2];
coverView.getLocationOnScreen(result);
return result;
}
private WindowManager.LayoutParams initParams(View floatView) {
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.token = floatView.getWindowToken();
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;// 程序提示window
layoutParams.format = PixelFormat.TRANSLUCENT;// 支持透明
//params.format = PixelFormat.RGBA_8888;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
return layoutParams;
}
/**
* 更新浮层View
*
* @param x X
* @param y Y
*/
public void updateView(int x, int y) {
if (currTouchedView != null) {
params.x = x - offsetX;
params.y = y - offsetY;
manager.updateViewLayout(currTouchedView, params);
}
}
/**
* 移除浮层view
*/
public void removeView() {
if (currTouchedView != null && manager != null) {
manager.removeView(currTouchedView);
}
}
}