Android开发笔记之 图片拖动

链接:http://www.2cto.com/kf/201109/102541.html

主要思想代码:
通过动态设置imageView的位置。来实现同步图片位置的移动。
private View.OnTouchListener movingEventListener = new View.OnTouchListener() {
int lastX, lastY;

@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
int X = (int) event.getRawX();
int Y = (int) event.getRawY();


switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();

break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;

int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
// 设置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
}

if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}

if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}

if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}

v.layout(left, top, right, bottom);

lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;

default:
break;
}
return true;
}
}; v.layout是相对与屏幕内布局的坐标的。getX();也是相对与屏幕布局的坐标。
而getRawX()是相对整个手机屏幕的左上角的。
因此如果利用getRawX()来计算布局内的坐标是会不准确的。
关于触屏事件原理的解释:(事情往往没有想象的简单啊,不懂的话很有可能做出一些奇怪的bug)
三个之间是有一定的关系。可以看做通过次数来计算的。
第一次进入触屏事件,默认你执行了down事件(即时你根本没有执行过down事件。比如在第一次进入触屏之后直接return) 
之后一段时间内进入触屏事件会当做move来处理。(这意味着没有绝对的第一次执行down事件,可能第一次在你看来相当于直接执行了move。比如在第一次进入触屏事件之后直接return,就会出现下次直接执行move的情况。。。。),之后的一段时间内的触屏事件都当做move来处理,直到你执行了up
最后会当做up处理。up完之后会恢复到down没执行的状态。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现两个Activity之间图片拖拽效果,需要使用Android的拖拽功能。以下是实现步骤: 1.在布局文件中添加一个ImageView,并设置其可拖拽属性: ```xml <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:contentDescription="@string/app_name" android:tag="image_draggable"/> ``` 注意:一定要设置imageView的tag属性,否则无法拖拽。 2.在Activity中注册DragListener和TouchListener: ```java ImageView imageView = findViewById(R.id.imageView); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) { // 开始拖拽 ClipData data = ClipData.newPlainText("", ""); View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(data, shadowBuilder, view, 0); return true; } else { return false; } } }); imageView.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View view, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: // 当拖拽开始时,该方法会被调用 break; case DragEvent.ACTION_DRAG_ENTERED: // 当拖拽的View进入目标View范围内时,该方法会被调用 break; case DragEvent.ACTION_DRAG_LOCATION: // 当拖拽的View在目标View范围内移动时,该方法会被调用 break; case DragEvent.ACTION_DRAG_EXITED: // 当拖拽的View离开目标View范围时,该方法会被调用 break; case DragEvent.ACTION_DROP: // 当拖拽的View在目标View范围内释放时,该方法会被调用 // 获取拖拽的数据 ClipData.Item item = event.getClipData().getItemAt(0); String dragData = item.getText().toString(); // 在这里处理拖拽的数据 break; case DragEvent.ACTION_DRAG_ENDED: // 当拖拽结束时,该方法会被调用 break; default: break; } return true; } }); ``` 3.在另一个Activity中实现onDragListener并接受拖拽的数据: ```java imageView.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View view, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DROP: // 当拖拽的View在目标View范围内释放时,该方法会被调用 // 获取拖拽的数据 ClipData.Item item = event.getClipData().getItemAt(0); String dragData = item.getText().toString(); // 在这里处理拖拽的数据 break; default: break; } return true; } }); ``` 这样就可以在两个Activity之间实现图片拖拽效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小公子三木君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值