控制View的OnClick OnTouch来实现LsitView的Item的侧滑出现删除

效果:

触摸:按下,移动,抬起

点击:一组触摸事件的组合(按下,松开)

长按:一组触摸事件的组合(按下,持续超过500ms(Android中))

为一个View设置点击事件:

        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("", "onClick");
            }
        });

为一个View设置touch事件:

        view.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        Log.i("", "ACTION_DOWN");
                        break;

                    case MotionEvent.ACTION_MOVE:
                        Log.i("", "ACTION_MOVE");
                        break;

                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        Log.i("", "ACTION_UP");
                        break;
                }
                return false;
            }
        });

当同时为一个View设置点击和touch事件时:

在onTouch返回false时:

当onTouch返回true时:

不在响应点击事件了

我们的需求是,在item关闭时可以响应点击事件(onTouch中返回false),在item打开时不响应点击事件(onTouch中返回true)

下面处理Touch事件:

ACTION_DOWN: 记录下手指按下的位置

ACTION_MOVE: 判断移动的距离(带正负号)移动item

ACTION_UP:根据手指抬起位置,将视图移动到合适的位置

listView 的 item 的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="86dp"
    android:layout_below="@+id/Listview" >

    <TextView
        android:id="@+id/more"
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@+id/delete"
        android:background="@android:color/darker_gray"
        android:clickable="true"
        android:gravity="center"
        android:onClick="more"
        android:text="更多"
        android:textColor="@android:color/white"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/delete"
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="@android:color/holo_red_light"
        android:clickable="true"
        android:gravity="center"
        android:onClick="delete"
        android:text="删除"
        android:textColor="@android:color/white"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_top"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_dark"
        android:gravity="center"
        android:text="item"
        android:textSize="20sp" />

</RelativeLayout>

自定义的View

package com.zyh.slideview;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MoveLayout extends RelativeLayout implements OnClickListener {

    private Context context;
    private int downX;
    private TextView tv_top;
    private TextView delete;
    private TextView more;

    public MoveLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public MoveLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MoveLayout(Context context) {
        this(context, null);
    }

    private void init(Context context) {
        this.context = context;
        LayoutInflater.from(context).inflate(R.layout.move_layout, this, true);
        delete = (TextView) findViewById(R.id.delete);
        more = (TextView) findViewById(R.id.more);
        tv_top = (TextView) findViewById(R.id.tv_top);
        tv_top.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return handlerTouch(v, event);
            }
        });
        tv_top.setOnClickListener(this);
        more.setOnClickListener(this);
        delete.setOnClickListener(this);
    }

    /* ---------------------处理 Touch-------------------------- */
    boolean result = false;
    boolean isOpen = false;

    protected boolean handlerTouch(View v, MotionEvent event) {

        int bottomWidth = delete.getWidth() + delete.getWidth();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // Log.i("", "ACTION_DOWN");
                downX = (int) event.getRawX();
                break;
            case MotionEvent.ACTION_MOVE:
                // Log.i("", "ACTION_MOVE");
                // if (isAniming)
                // break;
                int dx = (int) (event.getRawX() - downX);
                // Log.i("", "dy___" + dx);
                if (isOpen) {
                    // 打开状态
                    // 向右滑动
                    if (dx > 0 && dx < bottomWidth) {
                        v.setTranslationX(dx - bottomWidth);
                        // 允许移动,阻止点击
                        result = true;
                    }
                } else {
                    // 闭合状态
                    // 向左移动
                    if (dx < 0 && Math.abs(dx) < bottomWidth) {
                        v.setTranslationX(dx);
                        // 允许移动,阻止点击
                        result = true;
                    }
                }
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:

                // Log.i("", "ACTION_UP" + v.getTranslationX());

                // 获取已经移动的
                float ddx = v.getTranslationX();

                // 判断打开还是关闭

                if (ddx <= 0 && ddx > -(bottomWidth / 2)) {
                    // 关闭
                    ObjectAnimator oa1 = ObjectAnimator.ofFloat(v, "translationX", ddx, 0).setDuration(100);
                    oa1.start();
                    oa1.addListener(new AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {
                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            isOpen = false;
                            result = false;
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {
                            isOpen = false;
                            result = false;
                        }
                    });

                }
                if (ddx <= -(bottomWidth / 2) && ddx > -bottomWidth) {
                    // 打开
                    ObjectAnimator oa1 = ObjectAnimator.ofFloat(v, "translationX", ddx, -bottomWidth)
                            .setDuration(100);
                    oa1.start();
                    result = true;
                    isOpen = true;
                }
                break;
        }
        return result;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_top:
                Toast.makeText(context, "item", 0).show();
                break;
            case R.id.more:
                Toast.makeText(context, "more", 0).show();
                break;
            case R.id.delete:
                Toast.makeText(context, "delete", 0).show();
                break;
        }
    }
}

源代码:github](https://github.com/18236887539/SlideLayout)

时间: 2024-10-12 02:38:22

控制View的OnClick OnTouch来实现LsitView的Item的侧滑出现删除的相关文章

Android 使用NDK处理BItmap及如何通过C/C++直接控制View的suface显示,学习笔记及方向

最近的学习真的比较困难,因为学习了SDK开发项目后,做了一些简单的项目后,觉得在UI线程中加载较多图片时,总会出现卡顿的感觉,特别是手指滑动下拉时,这种卡顿更易察觉到,而java的结构化开发能力确实是很强大的,使用java开发确实是一件非常享受的事情,但是java在一些高密度的计算中是没有什么优势的,在享受内存自动回收时也会遇到一些不如意的事.任何语言或事物,总会有优缺点,这是java如此简单易用的一个副作用.所以为了不使java的副作用危害到开发者使用java,java产生了一种非常有吸引力的

xcode6中导航栏 控制view用程序编写

1.新建个视图控制器用来管理视图 2.新建个按钮 通过按钮把新的view压入栈中 爽歪歪是个按钮  一点击它  直接进入第二界面   在第二界面自动生成个返回按钮 xcode6中导航栏 控制view用程序编写,布布扣,bubuko.com

xcode中用oc代码基本控制view控件

控件代码部分: 编译运行后的结果为: 复杂一点的: 结果为: xcode中用oc代码基本控制view控件,布布扣,bubuko.com

在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容

通常,需要把View Model转换成json格式传给服务端.但在很多情况下,View Model既会包含字段,还会包含方法,我们只希望把字段相关的键值对传给服务端. 先把上一篇的Product转换成json格式,通过pre元素显示出来. <input data-bind="value: name"/><hr/> <select data-bind="options: categories, value: category" >&

Android View的onTouch和onClick和onLongClick事件

这三个事件的调用顺序是: onTouch->onLongClick->onClick 先看这三个事件的处理函数: public boolean onTouch(View v, MotionEvent event): public boolean onLongClick(View v): public void onClick(View v): 看到三个函数的返回值,只有onClick是void,而onTouch和onLongClick是boolean,原因是系统对这些事件的处理是有条件,必须满

Android中onTouch与onClick事件的关系

这几天遇到点关于Android的触摸事件相关的,还跟onClick有关,暂且记下: LinearLayout分别设置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回调 1.在屏幕上触摸之后基本的执行流程如下: onTouch,action=0onTouchEvent,action=0onTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,

onClick(View) of type new View.OnClickListener(){} must override a superclass method

原地址:http://blog.csdn.net/aeolus1019/article/details/8014798 Android开发过程中代码错误报错如下: - implements android.view.View.OnClickListener.onClick- The method onClick(View) of type new View.OnClickListener(){} must override a superclass 解决办法: 项目属性——javaCompile

View的事件分发机制解析

引言 Android事件构成 在Android中,事件主要包含点按.长按.拖拽.滑动等,点按又包含单击和双击,另外还包含单指操作和多指操作.全部这些都构成了Android中的事件响应.总的来说.全部的事件都由例如以下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 全部的操作事件首先必须运行的是按下操作(ACTION_DOWN).之后全部的操作都是以按下操作作为前提,当按下操作完毕后.接下来可能是一段移动(ACTION_MOVE)然后

使用 HorizontalScrollView 实现滚动控制

功能要求是屏幕上固定显示 3 个 Layout 项(图片+文字),支持点击切换到选择的 Layout 项,并支持滑动切换到最近的 Layout 项. 最后的效果如下: 下面逐步上代码: 布局文件 activity_main.xml 如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.co