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

Android Launcher 滑屏幕代码实现

2012-05-03 08:56 369 查看
public class DragGridView extends GridView

{

private String TAG = "DragGridView";



private int dragPosition; //开始拖拽的位置



private int dropPosition; //结束拖拽的位置



private int dragPointX; //相对于item的X坐标



private int dragPointY; //相对于item的y坐标



private int dragOffsetX;



private int dragOffsetY;



private ImageView dragImageView; //拖动item的preview



private WindowManager windowManager;



private WindowManager.LayoutParams windowParams;



public DragGridView(Context context)

{

super(context);

}



public DragGridView(Context context, AttributeSet attrs)

{

super(context, attrs);

}



@Override

public boolean onInterceptTouchEvent(MotionEvent ev)

{

Log.d(TAG, "onInterceptTouchEvent" + super.onInterceptTouchEvent(ev));

if (ev.getAction() == MotionEvent.ACTION_DOWN)

{

int x = (int)ev.getX();

int y = (int)ev.getY();

Log.d(TAG, "x=" + x + "getRawx=" + ev.getRawX());

Log.d(TAG, "y=" + y + "getRawY=" + ev.getRawY());

dragPosition = dropPosition = pointToPosition(x, y);

Log.i("TAG", "dragPosition=" + dragPosition);

if (dragPosition == AdapterView.INVALID_POSITION)

{

return super.onInterceptTouchEvent(ev);

}

Log.d(TAG, "getFirstPosition" + getFirstVisiblePosition());

View itemView = (View)getChildAt(dragPosition - getFirstVisiblePosition());

//得到当前点在item内部的偏移量即相对于item左上角的坐标

Log.d(TAG, "itemview.getLeft=" + itemView.getLeft() + ",itemview.getTop=" + itemView.getTop());



dragPointX = x - itemView.getLeft();//得到触摸的点,在item 内部相对于它的左边的点的坐标

dragPointY = y - itemView.getTop();



//item 左上角的坐标.(x,y)

dragOffsetX = (int)(ev.getRawX() - x);

dragOffsetY = (int)(ev.getRawY() - y);



Log.d(TAG, "dragPointX=" + dragPointX + ",dragPointY=" + dragPointY + ",dragOffsetX=" + dragOffsetX

+ ",dragOffsetY=" + dragOffsetY);



//解决问题3

//每次都销毁一次cache,重新生成一个bitmap

itemView.destroyDrawingCache();

itemView.setDrawingCacheEnabled(true);

Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());



//建立item的缩略图

startDrag(bm, x, y);

return false;

}

return super.onInterceptTouchEvent(ev);

}



private void startDrag(Bitmap bm, int x, int y)

{

stopDrag();

windowParams = new WindowManager.LayoutParams();

Log.i("xqqLog", "X:" + x + " dragPointX:" + dragPointX + " dragOffsetX:" + dragOffsetX);

windowParams.gravity = Gravity.TOP | Gravity.LEFT; //这个必须加

//得到preview左上角相对于屏幕的坐标

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 iv = new ImageView(getContext());

iv.setImageBitmap(bm);

windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);//"window"

windowManager.addView(iv, windowParams);

dragImageView = iv;



}



@Override

public boolean onTouchEvent(MotionEvent ev)

{

if (dragImageView != null && dragPosition != AdapterView.INVALID_POSITION)

{



switch (ev.getAction())

{

case MotionEvent.ACTION_UP:

int upX = (int)ev.getX();

int upY = (int)ev.getY();

stopDrag();

onDrop(upX,upY);

break;



case MotionEvent.ACTION_MOVE:

int moveX = (int)ev.getX();

int moveY = (int)ev.getY();

Log.d("ACTION_MOVE", "ACTION_MOVE x" + moveX + "ev.getRawx=" + ev.getRawX());

onDrag(moveX,moveY);

break;



}

}

return super.onTouchEvent(ev);

}



private void onDrag(int x, int y)

{

if (dragImageView != null)

{

windowParams.alpha = 0.6f;



// x 表示 相对于这个最边缘 本身view的布局坐标.

// dragPointx 表示相对于item左边的位置

// dragoffsetX 表示布局相对于 屏幕(0,0)的位置



// x-dragPointx = getLeft();

// y-dragPonitY =getTop();

windowParams.x = x - dragPointX + dragOffsetX;

windowParams.y = y - dragPointY + dragOffsetY;

windowManager.updateViewLayout(dragImageView, windowParams);

}

}



private void onDrop(int x, int y)

{

int tempPosition = pointToPosition(x, y);

if (tempPosition != AdapterView.INVALID_POSITION)

{

dropPosition = tempPosition;

}

if (dropPosition != dragPosition)

{

System.out.println("dragPosition: " + dragPosition + " dropPosition: " + dropPosition);

ImageAdapter adapter = (ImageAdapter)this.getAdapter();

adapter.exchange(dragPosition, dropPosition);



// 解决问题3

/*

* ViewGroup itemView1 = (ViewGroup)getChildAt(dragPosition -

* getFirstVisiblePosition()); ViewGroup itemView2 =

* (ViewGroup)getChildAt(dropPosition - getFirstVisiblePosition());

* itemView1.destroyDrawingCache(); itemView2.destroyDrawingCache();

*/

}

}



private void stopDrag()

{

if (dragImageView != null)

{

windowManager.removeView(dragImageView);

dragImageView = null;

}



}



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