public class DragLayout extends RelativeLayout //这玩意继承啥都行 {
public interface DragViewCallback {
void onDragViewClick();
}
private View mView;
private DraggerCallback mCallback;
private ViewDragHelper mDraggerHelper;
private DragViewCallback mDragViewCallback;
public void setDragViewCallback(DragViewCallback mDragViewCallback) {
this.mDragViewCallback = mDragViewCallback;
}
public DragLayout(Context context) {
super(context);
init();
}
public DragLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DragLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@Override
protected void onFinishInflate() {
mView = (View) this.findViewById(R.id.iv_customer);
mView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mDragViewCallback != null) {
mDragViewCallback.onDragViewClick();
}
}
});
mView.layout(1000, 100, 1000, 100);
super.onFinishInflate();
}
private void init() {
mCallback = new DraggerCallback();
mDraggerHelper = ViewDragHelper.create(this, 1.0f, mCallback);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDraggerHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDraggerHelper.processTouchEvent(event);
return super.onTouchEvent(event);
}
class DraggerCallback extends ViewDragHelper.Callback {
@Override
public boolean tryCaptureView(View child, int pointerId) {
//是否响应拖动
return true;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
//解决出边界问题
//取得左边界的坐标
final int leftBound = getPaddingLeft();
//取得右边界的坐标
final int rightBound = getWidth() - child.getWidth() - leftBound;
//这个地方的含义就是 如果left的值 在leftbound和rightBound之间 那么就返回left
//如果left的值 比 leftbound还要小 那么就说明 超过了左边界 那我们只能返回给他左边界的值
//如果left的值 比rightbound还要大 那么就说明 超过了右边界,那我们只能返回给他右边界的值
return Math.min(Math.max(left, leftBound), rightBound);
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
//解决出边界问题
final int topBound = getPaddingTop();
final int bottomBound = getHeight() - child.getHeight() - topBound;
return Math.min(Math.max(top, topBound), bottomBound);
}
@Override
public int getViewHorizontalDragRange(View child) {
//解决点击事件失效问题
return getMeasuredWidth() - child.getMeasuredWidth();
}
@Override
public int getViewVerticalDragRange(View child) {
//解决点击事件失效问题
return getMeasuredHeight() - child.getMeasuredHeight();
}
}
}
滑动控件起飞的另一种方式
最新推荐文章于 2021-11-16 19:31:04 发布