如何实现自定义MovableImageView仅支持向下拖动?
如何限制自定义MovableImageView仅能向下拖动?
嘿,你已经搞定了ImageView的拖动基础功能,现在要限制它只能向下移动?这事儿不难,只需要在触摸事件的处理逻辑里加几个简单的判断就能实现!
核心修改思路
要实现禁止左右、向上移动,仅允许向下,我们需要做两个关键调整:
- 完全固定
x坐标,不允许它有任何变化,这样左右拖动就被禁用了 - 只允许
y坐标向增大的方向变化(安卓坐标系里y值越大越靠下),也就是新位置的y值必须大于等于当前的y值,这样就没法向上拖了
修改后的完整代码
public class MovableImageView extends android.support.v7.widget.AppCompatImageView implements ImageView.OnTouchListener{ float x, y = 0; private static final String TAG = MovableImageView.class.getSimpleName(); public MovableImageView(Context context) { super(context); setOnTouchListener(this); } public MovableImageView(Context context, AttributeSet attrs) { super(context, attrs); setOnTouchListener(this); } public MovableImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x = this.getX() - event.getRawX(); y = this.getY() - event.getRawY(); break; case MotionEvent.ACTION_MOVE: // 计算新的y位置 float newY = event.getRawY() + y; // 仅允许向下移动:新位置的y值必须大于等于当前的y值 if (newY >= this.getY()) { this.animate() .x(this.getX()) // 固定x坐标,禁止左右移动 .y(newY) .setDuration(0) .start(); } Log.e("pos","x:"+String.valueOf(this.getX())+" y:"+String.valueOf(newY)); break; default: return false; } return true; } }
关键改动说明
- 禁止左右移动:在
ACTION_MOVE的动画里,把x(event.getRawX() + x)改成x(this.getX()),这样ImageView的x坐标始终保持当前值,不会随触摸事件改变 - 仅允许向下移动:先计算出目标y位置
newY,然后加判断newY >= this.getY(),只有满足这个条件才执行位置更新动画,确保只能往下拖,不能往上拉
如果之后你还需要限制ImageView不能拖出屏幕底部,可以再给newY加一个上限判断(比如不能超过屏幕高度减去ImageView自身高度),不过当前需求这样改就完全够用啦!
内容的提问来源于stack exchange,提问作者user3600801
相关产品推荐
相关产品推荐

