package ty.com.android.container;
import ty.com.android.container.adapter.LinkInfoAdapter;
import ty.com.android.container.util.Configure;
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.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
public class DragGridView extends GridView {
private static final String TAG = "DragGridView";
private int dragPosition;// 开始拖拽的位置
private int startPosition;//交换起始位置
private int holdPosition;//手指拖动时的位置
private int dropPosition;// 结束拖拽的位置
private int dragPointX; // 相对于item左上角的x坐标
private int dragPointY; // 相对于item左上角的y坐标
private int dragOffsetX;
private int dragOffsetY;
private int mColumns = 3;
private int moveUpX;//action_up时的x坐标
private int moveUpY;//action_up时的y坐标
private ImageView dragImageView; // 拖动item的preview
private ViewGroup dragViewGroup;
private WindowManager windowManager;
private WindowManager.LayoutParams windowParams;
private LinkInfoAdapter adapter;
private String mLastAnimationID;
private boolean isMoving = false;
public DragGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DragGridView(Context context) {
super(context);
}
private boolean setOnItemLongClickListener(final MotionEvent event) {
this.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Log.i(TAG, "onItemLongClick");
return false;
}
});
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.i(TAG, "onInterceptTouchEvent--->MotionEvent.ACTION_DOWN");
//return setOnItemLongClickListener(event);
int x = (int) event.getX();
int y = (int) event.getY();
dragPosition = pointToPosition(x, y);
//dragPosition = holdPosition = dropPosition = position;
startPosition = holdPosition = dropPosition = dragPosition;
Log.i(TAG, "dragPosition = " + dragPosition);
if (dragPosition == AdapterView.INVALID_POSITION) {
return false;
}
dragViewGroup = (ViewGroup) getChildAt(dragPosition
- getFirstVisiblePosition());
// 得到当前点在item内部的偏移量 即相对于item左上角的坐标
dragPointX = x - dragViewGroup.getLeft();
dragPointY = y - dragViewGroup.getTop();
Log.i(TAG, "X: " + x + ",dragPointX: " + dragPointX + ",dragPointY: "
+ dragPointY);
dragOffsetX = (int) (event.getRawX() - x);
dragOffsetY = (int) (event.getRawY() - y);//此值计算为状态栏和标题栏的宽度总和
Log.i(TAG, "X: " + x + ",dragOffsetX: " + dragOffsetX + ",dragOffsetY: "
+ dragOffsetY);
adapter = (LinkInfoAdapter) DragGridView.this.getAdapter();
Bitmap bitmap = getDragCacheBitmap(dragViewGroup);
startDrag(bitmap, x, y);
adapter.setHoldPosition(holdPosition);
adapter.notifyDataSetChanged();
isMoving = false;
return false;
}
return super.onInterceptTouchEvent(event);
}
/**
* 获取拖拽图标位图
* @param itemView
* @return
*/
private Bitmap getDragCacheBitmap(View itemView){
// 每次都销毁一次cache,重新生成一个bitmap
itemView.destroyDrawingCache();
itemView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
return bm;
}
/**
* 设置拖拽图标相对窗体位置
* @param event
*/
private void setWindowParams(int x, int y) {
// 建立item的缩略图
windowParams = new WindowManager.LayoutParams();
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;
}
/**
* 开始拖拽,拖出图标
* @param event
*/
private void startDrag(Bitmap bm, int x, int y) {
stopDrag();
if (dragPosition != AdapterView.INVALID_POSITION) {
setWindowParams(x, y);
dragImageView = new ImageView(getContext());
dragImageView.setImageBitmap(bm);
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(dragImageView, windowParams);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (dragImageView != null
&& dragPosition != AdapterView.INVALID_POSITION) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//startDrag(event);
//从onInterceptTouchEvent接收到ACTION_DOWN事件
Log.i(TAG, "onTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
onDrag(x, y);
if(!isMoving){
onMove(x, y);
}
break;
case MotionEvent.ACTION_UP:
moveUpX = x;
moveUpY = y;
onDrop();
break;
}
}
return true;
}
/**
* 拖拽中...如何加动画?
* @param x
* @param y
*/
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);
}
}
/**
* 加动画
* @param x
* @param y
*/
private void onMove(int x, int y){
int tempPosition = pointToPosition(x, y);
if(tempPosition != -1 && tempPosition != dragPosition){
dropPosition = tempPosition;
}
if(dragPosition != startPosition){
dragPosition = startPosition;
}
int moveNum = dropPosition - dragPosition;
if(moveNum != 0){
int itemMoveNum = Math.abs(moveNum);
float xOffset,yOffset;
for(int i = 0;i < itemMoveNum;i++){
if(moveNum > 0){
holdPosition = dragPosition + 1;
xOffset = (holdPosition/mColumns == dragPosition/mColumns) ? (-1) : (mColumns - 1);
yOffset = (holdPosition/mColumns == dragPosition/mColumns) ? 0 : (-1);
}else{
holdPosition = dragPosition - 1;
xOffset = (holdPosition/mColumns == dragPosition/mColumns) ? 1 : (-(mColumns - 1));
yOffset = (holdPosition/mColumns == dragPosition/mColumns) ? 0 : 1;
}
adapter.setHoldPosition(holdPosition);
Log.i(TAG, "holdPosition = " + holdPosition);
final ViewGroup moveView = (ViewGroup) getChildAt(holdPosition);
Animation animation = getMoveAnimation(xOffset, yOffset);
moveView.startAnimation(animation);
dragPosition = holdPosition;
Log.i(TAG, "dragPosition = " + dragPosition);
if(dragPosition == dropPosition){
mLastAnimationID = animation.toString();
}
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
isMoving = true;
}
@Override
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
TYIdeasContainer.rar (84个子文件)
TYIdeasContainer
bin
classes.dex 37KB
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
icon.png 4KB
drawable-mdpi
iradio.png 16KB
ijuegos.png 16KB
portal.png 19KB
mitelcel.png 14KB
itelcel.png 12KB
plugger.png 8KB
ic_launcher_shortcut_browser_bookmark.png 3KB
iapps.png 12KB
ijuegoshd.png 16KB
ivideo.png 13KB
icon.png 2KB
container.png 3KB
ipromociones.png 7KB
msngr.png 10KB
ideportes.png 15KB
imusic.png 6KB
jarlist.cache 119B
dexedLibs
annotations-8899042832e529d61285e2b81b5b5221.jar 943B
classes
ty
com
android
container
MainActivity.class 10KB
BuildConfig.class 357B
MainActivity$1.class 1KB
R$layout.class 528B
R$id.class 771B
R$drawable.class 917B
db
IdeasContainerDao.class 5KB
IdeasContainerDbHelper.class 5KB
DragGridView$3.class 1KB
EditLinkInfoActivity.class 4KB
R$attr.class 358B
R$menu.class 446B
DragGridView$2.class 2KB
R.class 625B
LinkInfo.class 1KB
adapter
LinkInfoAdapter.class 4KB
DragGridView.class 9KB
R$string.class 2KB
DragGridView$1.class 1KB
util
Configure.class 1KB
resources.ap_ 191KB
AndroidManifest.xml 1KB
TYIdeasContainer.apk 209KB
res
drawable-ldpi
icon.png 2KB
menu
menu_option.xml 195B
menu_link.xml 339B
drawable-hdpi
icon.png 4KB
values
strings.xml 3KB
drawable-mdpi
iradio.png 17KB
ijuegos.png 16KB
portal.png 19KB
mitelcel.png 15KB
itelcel.png 15KB
plugger.png 10KB
ic_launcher_shortcut_browser_bookmark.png 3KB
iapps.png 12KB
ijuegoshd.png 17KB
ivideo.png 14KB
icon.png 3KB
container.png 4KB
ipromociones.png 8KB
msngr.png 13KB
ideportes.png 16KB
imusic.png 6KB
layout
menu_header.xml 943B
link_info_item.xml 608B
link_info.xml 478B
edit_link_info.xml 3KB
xml
assets
gen
ty
com
android
container
BuildConfig.java 166B
R.java 5KB
proguard.cfg 1KB
src
ty
com
android
container
db
IdeasContainerDao.java 4KB
IdeasContainerDbHelper.java 4KB
MainActivity.java 9KB
adapter
LinkInfoAdapter.java 4KB
DragGridView.java 11KB
EditLinkInfoActivity.java 3KB
util
Configure.java 472B
LinkInfo.java 817B
.project 852B
.classpath 380B
project.properties 563B
AndroidManifest.xml 1KB
共 84 条
- 1
zenggongliang
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页