Android如何在没有onDown true的情况下在LinearLayout上添加滑动手势

2023-11-26

我正在研究 android 中的手势活动,我使用类来检测滑动动作是

public class ActivitySwipeDetector  implements View.OnTouchListener {

    static final String logTag = "ActivitySwipeDetector";
    private Activity activity;
    static final int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;

    public ActivitySwipeDetector(Activity activity){
        this.activity = activity;
    }

    public void onRightToLeftSwipe(){
        Log.i(logTag, "RightToLeftSwipe!");
        Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show();
        //activity.doSomething();
    }

    public void onLeftToRightSwipe(){
        Log.i(logTag, "LeftToRightSwipe!");
        Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show();
        //activity.doSomething();
    }

    public void onTopToBottomSwipe(){
        Log.i(logTag, "onTopToBottomSwipe!");
        //Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show();
        //activity.doSomething();
    }

    public void onBottomToTopSwipe(){
        Log.i(logTag, "onBottomToTopSwipe!");
        //Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show();
        //activity.doSomething();
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            return true;
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // swipe horizontal?
                    if(Math.abs(deltaX) > MIN_DISTANCE){
                        // left or right
                        if(deltaX < 0) { this.onLeftToRightSwipe(); return true; }
                        if(deltaX > 0) { this.onRightToLeftSwipe(); return true; }
                    }
                    else {
                        Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                        return false; // We don't consume the event
                    }

                    // swipe vertical?
                    if(Math.abs(deltaY) > MIN_DISTANCE){
                        // top or down
                        if(deltaY < 0) { this.onTopToBottomSwipe(); return true; }
                        if(deltaY > 0) { this.onBottomToTopSwipe(); return true; }
                    }
                    else {
                        Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                        return false; // We don't consume the event
                    }

                    return true;
        }
        }
        return false;
    }

}

我的 xml 文件是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/action_settings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>

在我的活动中我这样称呼

ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this);
        LinearLayout lowestLayout = (LinearLayout)this.findViewById(R.id.action_settings);
        lowestLayout.setOnTouchListener(activitySwipeDetector);

我打了电话ActivitySwipeDetector(this);所以它在充分活动的情况下工作正常。但是我如何才能将滑动检测器仅应用于 LinearLayout 而不是整个 Activity。请帮帮我。


我需要,最好的是你的代码,所以我修复了一点,需要更多修复,请参阅评论

public class RelativeLayoutTouchListener implements OnTouchListener {

    static final String logTag = "ActivitySwipeDetector";
    private Activity activity;
    static final int MIN_DISTANCE = 100;// TODO change this runtime based on screen resolution. for 1920x1080 is to small the 100 distance
    private float downX, downY, upX, upY;

    // private MainActivity mMainActivity;

    public RelativeLayoutTouchListener(MainActivity mainActivity) {
        activity = mainActivity;
    }

    public void onRightToLeftSwipe() {
        Log.i(logTag, "RightToLeftSwipe!");
        Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show();
        // activity.doSomething();
    }

    public void onLeftToRightSwipe() {
        Log.i(logTag, "LeftToRightSwipe!");
        Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show();
        // activity.doSomething();
    }

    public void onTopToBottomSwipe() {
        Log.i(logTag, "onTopToBottomSwipe!");
        Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show();
        // activity.doSomething();
    }

    public void onBottomToTopSwipe() {
        Log.i(logTag, "onBottomToTopSwipe!");
        Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show();
        // activity.doSomething();
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            return true;
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // swipe horizontal?
            if (Math.abs(deltaX) > MIN_DISTANCE) {
                // left or right
                if (deltaX < 0) {
                    this.onLeftToRightSwipe();
                    return true;
                }
                if (deltaX > 0) {
                    this.onRightToLeftSwipe();
                    return true;
                }
            } else {
                Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long horizontally, need at least " + MIN_DISTANCE);
                // return false; // We don't consume the event
            }

            // swipe vertical?
            if (Math.abs(deltaY) > MIN_DISTANCE) {
                // top or down
                if (deltaY < 0) {
                    this.onTopToBottomSwipe();
                    return true;
                }
                if (deltaY > 0) {
                    this.onBottomToTopSwipe();
                    return true;
                }
            } else {
                Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long vertically, need at least " + MIN_DISTANCE);
                // return false; // We don't consume the event
            }

            return false; // no swipe horizontally and no swipe vertically
        }// case MotionEvent.ACTION_UP:
        }
        return false;
    }

}

Usage:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rlTop = (RelativeLayout) findViewById(R.id.rlTop);      
    rlTop.setOnTouchListener(new RelativeLayoutTouchListener(this));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android如何在没有onDown true的情况下在LinearLayout上添加滑动手势 的相关文章

  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • Android 30+ 中的视频捕获意图 - 只有所有者才能与待处理项目交互

    我正在尝试在我的应用程序上捕获视频 它可以在 android API 30 以下运行 但不能在 30 以上运行 似乎在 sdk 30 之后 android 不允许完全读取外部存储 作用域存储 我目前遇到这个错误 java lang Ille
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • Spring-boot+JPA EntityManager注入失败

    在我的 J2EE 应用程序中 我尝试使用 spring boot 和 JPA 技术 并将 EntityManager 注入到 DAO 层 但是 我有一些问题 我的用户 CRUD 存储库 Repository public class Use
  • 推荐放置小型 python 便利模块的位置在哪里

    我收集了一小部分方便的临时脚本 我希望在我的所有 python 项目和 ipython 交互式会话中都可以使用它们 我想添加并清理这个集合 而不必担心制作 setup py 文件并正式安装它们 默认情况下 从 sys path 上的目录列表
  • php echo 中的 \n 或 \n 不打印[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中用单引号打印换行符 php中单引号和双引号字符串的区别 unit1 paragrahp1 unit2 paragrahp2 echo p unit1 p n echo p unit2 p
  • Backbone.js 获取更复杂的数据并用作集合

    假设我有这样的 json 设置 page 1 items name item1 id 1 name item1 id 2 name item1 id 3 还有这样的建模 var Item Backbone Model extend defa
  • Codeigniter - 无法修改标头信息 - 标头已发送

    A PHP Error was encountered Severity Warning Message Cannot modify header information headers already sent by output sta
  • 正则表达式:验证具有多个分隔符的欧洲日期格式

    我想验证欧洲日期格式 例如 10 02 2012 或 10 02 2012 因此我创建了以下正则表达式 d 0 9 2 d 0 9 2 d 0 9 4 不幸的是 即使日期的格式正确 我总是收到无效的消息 当我将 替换为 时仅验证用点分隔的日
  • 在大写字母处插入或分割字符串 Objective-c

    在 Objective C 中将 ThisStringIsJoined 之类的字符串转换为 This String Is Joined 最有效的方法是什么 我从不受我控制的网络服务收到这样的字符串 我想将数据呈现给用户 所以我想通过在每个大
  • Oauth 导入错误

    我在用Python on windows使用相同的代码 它工作得很好 现在它突然发生了更新程序的变化 我发现了错误导入错误 无法将名称导入到 native string你能帮我看看为什么会出现这个错误吗 Traceback most rec
  • Android NDK 调试

    对于我来说 Android NDK 文档似乎不太清楚如何运行命令序列来将调试信息放入和取出提供的 ndk gdb 可执行文件 如果有关于在什么行上中断以及在什么文件中中断的格式 是否有某个地方有规范 如果是这样 那么您如何向该调试器提供该信
  • 我可以使用 Html Agility Pack 来解析 HTML 片段吗?

    Html Agility Pack 可以用来解析 html 字符串片段吗 Such As var fragment b Some code b 然后全部提取 b 标签 到目前为止我看到的所有示例都是像 html 文档一样加载的 如果是 ht
  • 如何访问qt上的父小部件?

    我有一个继承的 QTreeWidget 称为 PackList 类 其父类是 KXmlGuiWindow 我怎样才能访问父级的插槽 我已经尝试过 QTreeWidget 类中的 getParent gt mySlot 但我有 error n
  • 访问私有变量的单元测试

    我有一个单元测试课Tester 我希望它访问 a 的私有字段Working class class Working private int m variable class Tester void testVariable Working
  • GitPython 通过 sha 获取树和 blob 对象

    我正在将 GitPython 与裸存储库一起使用 并尝试通过其 SHA 获取特定的 git 对象 如果我直接使用git 我会这样做 git ls tree sha of tree git show sha of blob 由于我使用 Git
  • 如何创建一个 npm 脚本来运行多个命令来运行一些测试?

    当我为 angularjs 应用程序运行 e2e 测试时 我需要在不同的 shell 会话中运行以下命令 start the selenium server webdriver manager start start a http serv
  • 如何为属性创建 TypeScript @enumerable(false) 装饰器

    我想在 TypeScript 中创建一个装饰器 以便能够使类属性不可枚举 我找到了一个例子 enumerable here https www typescriptlang org docs handbook decorators html
  • Mac 上的 file_exists() 是否区分大小写?

    首先 Mac OS X 不是我的原生操作系统 但由于我对 Ubuntu 很熟悉 所以在很大程度上 它是一个轻松的过渡 由于它是基于 Unix 的 所以我的印象是这个操作系统区分大小写 但是file exists 函数另有说法 在我的 htd
  • C 标准 malloc 字符的潜在问题

    在回答我的另一个答案的评论时here 我找到了我所想的may是 C 标准中的一个漏洞 c1x 我没有检查过早期的标准 是的 我知道在这个星球上的所有居民中 只有我一个人发现了标准中的错误 这是难以置信的 信息如下 第 6 5 3 4 节 s
  • 如何在 Swift 5 中添加滚动视图?

    我想在我的项目中添加滚动视图 但在 swift 5 中我无法添加它我尝试了很多方法 IBOutlet weak var scrollView UIScrollView IBOutlet weak var imageViewBottomCon
  • 使 mat-card-image 中的所有图像大小相同但比例正确

    这通常不是问题 但只是 Material 2 的记录很少 所以我很难使所有图像具有相同的尺寸 但可以通过窗口更改正确调整大小 当我创建时 我拥有的所有图像的大小都非常相似 但其中一个在高度方面稍长一些 但我的旧代码只是通过一些引导调用进行了
  • Android如何在没有onDown true的情况下在LinearLayout上添加滑动手势

    我正在研究 android 中的手势活动 我使用类来检测滑动动作是 public class ActivitySwipeDetector implements View OnTouchListener static final String