android-SwipeLinearLayout解析及使用

本文介绍了SwipeLinearLayout的工作原理和使用方法,包括如何创建此类、处理触摸事件、拦截父视图的touch事件以及实现自动滑动动画。通过分析onLayout、onTouchEvent和onInterceptTouchEvent方法,理解其在滑动操作中的角色。同时,文章提供了使用SwipeLinearLayout构建实际项目的步骤,包括创建布局、适配器和最终效果展示。
摘要由CSDN通过智能技术生成

工作中需要用到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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值