自定义布局左右滑动,内含GridView
public class SlideLayout extends LinearLayout implements View.OnTouchListener {
/**
* 手指按下的横坐标
*/
private float xDown;
/**
* 在被判定为滚动之前用户手指可以移动的最大值。
*/
private int touchSlop;
private boolean leftViewShow = true;
private View lefter;
private ViewGroup.MarginLayoutParams lefterLayoutParams;
private int leftWidth;
private GridView gridView;
private boolean isSlided = false;
public SlideLayout(Context context) {
super(context);
init(context);
}
public SlideLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SlideLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
lefter = LayoutInflater.from(context).inflate(R.layout.lefter_layout, null, true);
addView(lefter, 0);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
lefterLayoutParams = (MarginLayoutParams) lefter.getLayoutParams();
leftWidth = lefter.getWidth();
gridView = (GridView) getChildAt(1);
gridView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int width = -leftWidth / 2;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
float xMove = event.getRawX();
int distance = (int) (xMove - xDown);
if (Math.abs(distance) < touchSlop) {
isSlided = false;
} else
isSlided = true;
// 要让gridView失去焦点,否则被点击的那一项会一直处于选中状态
gridView.setPressed(false);
gridView.setFocusable(false);
gridView.setFocusableInTouchMode(false);
if (distance < 0) {
if (leftViewShow) {
lefterLayoutParams.leftMargin = distance / 3;
lefter.setLayoutParams(lefterLayoutParams);
}
}
if (distance > 0) {
if (!leftViewShow) {
lefterLayoutParams.leftMargin = distance / 3 - leftWidth;
lefter.setLayoutParams(lefterLayoutParams);
}
}
break;
case MotionEvent.ACTION_UP:
// 判断leftView的坐标,如果隐藏的部分超过一半,就直接滑动过去全部隐藏
// 如果显示的部分超过一半,也直接滑动过来直接显示
if (lefterLayoutParams.leftMargin <= width) {
lefterLayoutParams.leftMargin = -leftWidth;
lefter.setLayoutParams(lefterLayoutParams);
leftViewShow = false;
} else if (lefterLayoutParams.leftMargin >= width) {
lefterLayoutParams.leftMargin = 0;
lefter.setLayoutParams(lefterLayoutParams);
leftViewShow = true;
}
// 解决onTouch和onClick的冲突
return isSlided;
}
return false;
}
}
网友评论