package com.example.xiaolin.draggridview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
public class DragGridView extends GridView {
private static final int DRAG_IMG_SHOW = 1;
private static final int DRAG_IMG_NOT_SHOW = 0;
private static final String LOG_TAG = "DragGridView";
private static final float AMP_FACTOR = 1.2f;
private ImageView dragImageView;
private WindowManager.LayoutParams dragImageViewParams;
private WindowManager windowManager;
private boolean isViewOnDrag = false;
/**previous dragged over position*/
private int preDraggedOverPositon = AdapterView.INVALID_POSITION;
private int downRawX;
private int downRawY;
private OnItemLongClickListener onLongClickListener = new OnItemLongClickListener(){
@Override
//长按item开始拖动
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//记录长按item位置
preDraggedOverPositon = position;
//获取被长按item的drawing cache
view.destroyDrawingCache();
view.setDrawingCacheEnabled(true);
//通过被长按item,获取拖动item的bitmap
Bitmap dragBitmap = Bitmap.createBitmap(view.getDrawingCache());
//设置拖动item的参数
dragImageViewParams.gravity = Gravity.TOP | Gravity.LEFT;
//设置拖动item为原item 1.2倍
dragImageViewParams.width = (int)(AMP_FACTOR*dragBitmap.getWidth());
dragImageViewParams.height = (int)(AMP_FACTOR*dragBitmap.getHeight());
//设置触摸点为绘制拖动item的中心
dragImageViewParams.x = (downRawX - dragImageViewParams.width/2);
dragImageViewParams.y = (downRawY - dragImageViewParams.height/2);
dragImageViewParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
dragImageViewParams.format = PixelFormat.TRANSLUCENT;
dragImageViewParams.windowAnimations = 0;
//dragImageView为被拖动item的容器,清空上一次的显示
if((int)dragImageView.getTag() == DRAG_IMG_SHOW) {
windowManager.removeView(dragImageView);
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
}
//设置本次被长按的item
dragImageView.setImageBitmap(dragBitmap);
//添加拖动item到屏幕
windowManager.addView(dragImageView, dragImageViewParams);
dragImageView.setTag(DRAG_IMG_SHOW);
isViewOnDrag = true;
//设置被长按item不显示
((GridViewAdapter)getAdapter()).hideView(position);
return true;
}
};
public DragGridView(Context context) {
super(context);
initView();
}
public DragGridView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public DragGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public void initView() {
setOnItemLongClickListener(onLongClickListener);
//初始化显示被拖动item的image view
dragImageView = new ImageView(getContext());
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
//初始化用于设置dragImageView的参数对象
dragImageViewParams = new WindowManager.LayoutParams();
//获取窗口管理对象,用于后面向窗口中添加dragImageView
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//被按下时记录按下的坐标
if(ev.getAction() == MotionEvent.ACTION_DOWN) {
//获取触摸点相对于屏幕的坐标
downRawX = (int)ev.getRawX();
downRawY = (int)ev.getRawY();
}
//dragImageView处于被拖动时,更新dragImageView位置
else if((ev.getAction() == MotionEvent.ACTION_MOVE) && (isViewOnDrag == true)) {
Log.i(LOG_TAG, "" + ev.getRawX() + " " + ev.getRawY());
//设置触摸点为dragImageView中心
dragImageViewParams.x = (int)(ev.getRawX() - dragImageView.getWidth()/2);
dragImageViewParams.y = (int)(ev.getRawY() - dragImageView.getHeight()/2);
//更新窗口显示
windowManager.updateViewLayout(dragImageView, dragImageViewParams);
//获取当前触摸点的item position
int currDraggedPosition = pointToPosition((int)ev.getX(), (int)ev.getY());
//如果当前停留位置item不等于上次停留位置的item,交换本次和上次停留的item
if((currDraggedPosition != AdapterView.INVALID_POSITION) && (currDraggedPosition != preDraggedOverPositon)) {
((GridViewAdapter)getAdapter()).swapView(preDraggedOverPositon, currDraggedPosition);
preDraggedOverPositon = currDraggedPosition;
}
}
//释放dragImageView
else if((ev.getAction() == MotionEvent.ACTION_UP) && (isViewOnDrag == true)) {
((GridViewAdapter)getAdapter()).showHideView();
if((int)dragImageView.getTag() == DRAG_IMG_SHOW) {
windowManager.removeView(dragImageView);
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
}
isViewOnDrag = false;
}
return super.onTouchEvent(ev);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
共39个文件
xml:16个
png:4个
java:4个
需积分: 9 14 下载量 109 浏览量
2017-10-25
14:39:23
上传
评论
收藏 116KB ZIP 举报
温馨提示
Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换,项目详情http://blog.csdn.net/xiaanming/article/details/17718579
资源推荐
资源详情
资源评论
收起资源包目录
DragGridView-master.zip (39个子文件)
DragGridView-master
DragGridView.iml 877B
gradlew.bat 2KB
gradlew 5KB
gradle.properties 855B
app
proguard-rules.pro 673B
src
androidTest
java
com
example
xiaolin
draggridview
ApplicationTest.java 363B
main
res
menu
menu_main.xml 361B
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
ic_launcher.png 14KB
drawable-xxhdpi
ic_launcher.png 19KB
values
strings.xml 222B
styles.xml 194B
dimens.xml 211B
drawable-mdpi
ic_launcher.png 5KB
layout
activity_main.xml 910B
values-w820dp
dimens.xml 358B
java
com
example
xiaolin
draggridview
GridViewAdapter.java 2KB
MainActivity.java 875B
DragGridView.java 6KB
AndroidManifest.xml 700B
app.iml 7KB
.gitignore 7B
build.gradle 598B
gradle
wrapper
gradle-wrapper.jar 49KB
gradle-wrapper.properties 232B
.idea
scopes
scope_settings.xml 139B
gradle.xml 657B
misc.xml 396B
vcs.xml 166B
.name 12B
copyright
profiles_settings.xml 74B
modules.xml 363B
dictionaries
xiaolin.xml 86B
encodings.xml 166B
compiler.xml 711B
.gitignore 81B
settings.gradle 15B
.gitattributes 378B
build.gradle 436B
共 39 条
- 1
资源评论
hzj1028937670
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功