工作中需要用到SwipeLinearLayout这个框架,以前一直都没有用过,今天来学习一下。
首先,去github下这个demo。
跟着demo来边写边分析。
首先,创建一个SwipeLinearLayout类继承LinearLayout。
package com.mystudy.kibi.swipelinearlayout;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
/**
* Created by Nicole on 16/9/25.
*/
public class SwipeLinearLayout extends LinearLayout {
public SwipeLinearLayout(Context context) {
super(context);
}
public SwipeLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public SwipeLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
然后重写onLayout方法,获取第一层view的宽度以及第二层view的宽度。
// 左边部分, 即从开始就显示的部分的长度
int width_left = 0;
// 右边部分, 即在开始时是隐藏的部分的长度
int width_right = 0;
/**
* 该方法在ViewGroup中定义是抽象函数,继承该类必须实现onLayout方法
* @param changed
* @param l
* @param t
* @param r
* @param b
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
View left = getChildAt(0); //获取第一层View
View right = getChildAt(1); //获取第二层View
width_left = left.getMeasuredWidth();
width_right = right.getMeasuredWidth();
}
接下来重写它的触摸事件
float lastX;
float lastY;
float startX;
float startY;
boolean hasJudged = false;
boolean ignore = false;
static float MOVE_JUDGE_DISTANCE = 5;
/**
* 触摸事件
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// getAction:触摸动作的原始32位信息,包括事件的动作,触控点信息
// getActionMask:触摸的动作,按下,抬起,滑动,多点按下,多点抬起
// getActionIndex:触控点信息
switch (ev.getActionMasked()){
case MotionEvent.ACTION_DOWN:
/**
* 拦截父层的View截获touch事件
*/
hasJudged = false; //不允许判断
startX = ev.getX();
startY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
float curX = ev.getX();
float cutY = ev.getY();
if(hasJudged == false){ //相当于一个触摸监听的锁
float dx = curX - startX;
float dy = cutY - startY;
if(dx * dx + dy * dy > MOVE_JUDGE_DISTANCE * MOVE_JUDGE_DISTANCE){
if(Math.abs(dy) > Math.abs(dx)){ //基本就是listview上下滑动,允许父层的View截获touch事件被父层拦截touch事件
/**
* 允许父层的View截获touch事件
*/
/**
* 是否有停止监听事件
*/
} else {
/**
* 监听事件,让这个框架干什么
*/
lastX = curX;
lastY = cutY;
}
hasJudged = true;
ignore =