[java]
package cn.com.weather.serviceDemo.view;

import cn.com.weather.serviceDemo.interfaces.OnDropListener;
import cn.com.weather.serviceDemo.util.DeviceUtil;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;

public class MyGridView extends GridView{

private ImageView dragImageView;
private WindowManager windowManager;
private WindowManager.LayoutParams windowParams;

private int dragSrcPosition;//开始拖拽项
private int dragPosition;

//移动的位置
private int dragPointX;
private int dragPointY;
//当前位置距离边界的位置
private int dragOffsetX;
private int dragOffsetY;

private View myView;//目标view
private int dropPosition = -1;//选中项

private OnDropListener onDropListener;

public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setView(View view){
myView = view;
}

public void setOnDropListener(OnDropListener onDropListener){
this.onDropListener = onDropListener;
}

private boolean setOnItemLongClickListener(final MotionEvent ev){
this.setOnItemLongClickListener(new OnItemLongClickListener() {

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
final int x = (int)ev.getX();//触摸点相对于GridView的坐标
final int y = (int)ev.getY();

dragSrcPosition = dragPosition = position;

if(dragPosition == AdapterView.INVALID_POSITION ){
return false;
}

final ViewGroup item = (ViewGroup)getChildAt(dragPosition - getFirstVisiblePosition());

dragPointX = x - item.getLeft();
dragPointY = y - item.getTop();
dragOffsetX = (int)ev.getRawX() - x;
dragOffsetY = (int)ev.getRawY() - y;

item.destroyDrawingCache();//清除cache
item.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache());
startDrag(getScaleBitmap(bitmap), x, y);
DeviceUtil.Vibrate(getContext(), 100);
return false;
}
});

return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
return setOnItemLongClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
if(dragImageView != null && dragPosition != AdapterView.INVALID_POSITION){
int x = (int)ev.getX();
int y = (int)ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
stopDrag();
onDrop((int)ev.getRawX(), (int)ev.getRawY());
break;

case MotionEvent.ACTION_MOVE:
onDrag(x, y);
break;
}


}
return super.onTouchEvent(ev);
}

private void startDrag(Bitmap bm, int x, int y){
stopDrag();

windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP|Gravity.LEFT;
//左上角相对于屏幕的坐标
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;

windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;

ImageView imageView = new ImageView(this.getContext());
imageView.setImageBitmap(bm);

windowManager = (WindowManager)this.getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(imageView, windowParams);
dragImageView = imageView;
}

private void stopDrag(){
if (dragImageView != null) {
windowManager.removeView(dragImageView);
dragImageView = null;
}
}

private void onDrag(int x, int y){
if(dragImageView != null){
windowParams.alpha = 0.8f;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
windowManager.updateViewLayout(dragImageView, windowParams);
}

}

private void onDrop(int x, int y){
boolean inView = isInView(x, y, myView);
if(inView){
if(onDropListener!=null){
onDropListener.onDrop(dragSrcPosition);
}
}
}

private Bitmap getScaleBitmap(Bitmap bitmap){
Matrix matrix = new Matrix();
matrix.postScale(1.1f, 1.1f);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

private boolean isInView(int x, int y, View view){
if(view == null) return false;

int[] location = new int[2];
view.getLocationInWindow(location);
int _x = location[0];
int _y = location[1];
int width = view.getWidth();
int height = view.getHeight();

if(_x <x && x <_x+width && _y<y && y<_y+height){
return true;
}
return false;
}



}

更多相关文章

  1. Android PopupWindow显示位置和显示大小
  2. Android根据经纬度获取位置信息
  3. Android P SystemUI下拉时,状态栏和通知栏显示位置不一致。
  4. Android中保存并设置ListView位置
  5. Android XML属性在文档中的位置
  6. android 自定义Dialog背景透明及显示位置设置
  7. 【Android动态布局】之【使用addView方法时,如何保持已有动态控件
  8. 修改AVD的存放位置
  9. Android 将 android view 的位置设为右下角的解决方法

随机推荐

  1. [android] android下创建一个sqlite数据
  2. Service与Android系统实现(1)-- 应用程序里
  3. Android(安卓)Studio 首次创建工程下载Gr
  4. Android第一个JNI程序
  5. Android——《Android第一行代码》中使用
  6. Android(安卓)Framework Display/Framewo
  7. listView的item中有checkbox,导致setOnIte
  8. EditText弹出软件盘时不进行全屏
  9. Android之基于BaseAdapter和SimpleAdapte
  10. 集成第三方库到android程序方法