实现一个通用的支持输入原因并且可以滑动消失的Dialog

交互弹窗设计避坑指南:Toast、Dialog、Actionbar和Snackbar的常见误区和最佳实践 本文深入解析交互弹窗设计中的常见误区与最佳实践,涵盖Toast、Dialog、Actionbar和Snackbar四种主流弹窗类型。通过对比模态与非模态弹窗的特性,提供场景化选择建议,并针对各类弹窗的高频错误给出优化方案,帮助设计师提升用户体验和界面交互效率。 阅读详情
package com.zdj.zdj_library.widget;

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.PopupWindow;

import androidx.annotation.NonNull;

import com.zdj.zdj_library.R;
import com.zdj.zdj_library.util.UiUtils;
import com.zdj.zdj_library.view.TitleBar;

/**
 * <pre>
 *     author : zhangdj
 *     time   : 2021/07/12
 *     desc   : 原因弹框
 *              注:该弹框支持跟随手指向下滑动
 *              实现思路:自定义Dialog,重写onTouchEvent。在down的时候记录y,滑动的时候计算出滑动距离。scrollBy控制view(decorView,通过getWindow().getDecorView()得到dialog的decorView)的滑动。
 *              确保view不能往上滑动溢出,所以控制view.getScrollY大于0的时候重置。手指抬起的时候判断滑动方向如果是向下并且超过四分之一,隐藏dialog,然后重置view的内容的位置。
 *              通过改变mScrollY来变化view的位置,实际上view本身并没有发生移动,移动的是view的内容。view的内容和view本身的横向纵向距离就是mScrollX和mScrollY的值。
 * </pre>
 */
public class ReasonDialog extends Dialog {
    Context context;
    View view;

    public ReasonDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        setContentView(R.layout.dialog_reason);
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.width = layoutParams.MATCH_PARENT;
        layoutParams.height = (int) (UiUtils.getHeight(context) * 0.6);
        window.setAttributes(layoutParams);
        window.setGravity(Gravity.BOTTOM);
        this.context = context;
        view = window.getDecorView();
    }

    public void init(final String title, final Callback callback) {
        TitleBar titleBar = findViewById(R.id.titleBar);
        titleBar.setViewVisible(false, false, false, true, true)
                .setTitleTvText(title)
                .setLeftTvText(this.context.getString(R.string.cancel))
                .setRightTvText(this.context.getString(R.string.confirm))
                .setLeftTvTextColor(this.context.getResources().getColor(R.color.light_gray_6))
                .setRightTvTextColor(this.context.getResources().getColor(R.color.blue));
        final EditText et_reason = findViewById(R.id.et_reason);
        UiUtils.setEditTextHintTextSize("200个字以内", 14, et_reason);
        titleBar.setClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.tv_left) {
                    dismiss();
                } else if (v.getId() == R.id.tv_right) {
                    dismiss();
                    if (callback != null) {
                        String reason = et_reason.getText().toString();
                        if (reason == null) {
                            reason = "";
                        }
                        callback.confirm(reason);
                    }
                }
            }
        });
    }

    float startY;
    float moveY;

    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                moveY = event.getY() - startY;
                //传正值往上滑动,传负值往下滑动。这个在view的scrollBy、scrollTo方法源码解析里面已经分析过。
                view.scrollBy(0, -(int)moveY);
                startY = event.getY();
                if (view.getScrollY() > 0) {
                    view.scrollTo(0, 0);
                }
                break;
            case MotionEvent.ACTION_UP:
                if (view.getScrollY() < -this.getWindow().getAttributes().height / 4) {
                    this.dismiss();
                }
                view.scrollTo(0,0);
                break;
        }
        return super.onTouchEvent(event);
    }



    public Callback callback;
    public interface Callback {
        void confirm(String reason);
    }
}

空闲之余,记录一下。代码里面很清晰,并且有注释。直接看代码即可。

安卓Dialog对话框相关-Activity随手势滑动退出及模糊Dialog.rar Activity随手势滑动退出,及模糊Dialog.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 立即下载

相关推荐

上滑消失下滑出现

上滑消失下滑出现,博客地址:http://blog.youkuaiyun.com/Mr_dsw/article/details/50527278

对话框上滑向上移动消失,下滑向下移动消失

效果如下: 我是建立在对话框的基础上实现该效果的,若Dialog简单使用动画效果,只要在style文件设置进入跟退出的样式的就可以。那现在的是进入正常的对话框弹出,上滑对话框向上移动并消失,下滑向下移动并消失。

JackyCheung 1953

半透明dialog从左往右滑动显示

半透明dialog从左往右滑动显示

可滑动关闭的对话框(一)

前言Uber大家都用过,有时候它的对话框是从顶部落下来,你可以把它推上去关闭,或者把它拽下去关闭。我觉得这种交互方式很好。符合认知,也更加便捷。用在一些非关键信息的展示很合适,比如广告。效果图原理并没有去继承Dialog,而是直接将dialog视图通过WindowManager.addView方法添加到窗口中。当然,我在dialog视图外层包了一层FrameLayout用来获取并处理触摸事件,并实现

海洋顶端 2009

【图形学】后处理下的HDR、颜色分级、颜色映射与颜色空间

目录 一、Color Grading 1.1概念 1.2 内置在Unity/UE4 二、HDR、LDR与VDR 2.1 LDR 2.2 HDR 2.3 VDR 三、Tone Mapping 3.1 概念 3.2 算法发展史 3.3 ACES算法 四、常见的颜色空间标准 参考 一、Color Grading 1.1概念 Color Grading(颜色分级、颜色校正)俗称调色,是游戏后期处理中最常见也是必要的一个环节。它能够改变或矫正最终图像的颜色和亮度,你可以把它想象...

ColorGalaxy 8419

手把手教你理解瑞萨RH850芯片的HSM:从硬件隔离到软件中断通信

本文深入解析瑞萨RH850芯片的HSM架构,从硬件隔离到软件中断通信的完整实现。通过详细讲解HSM的硬件组件、启动流程、核间通信机制及安全服务实现,帮助开发者掌握芯片级安全技术,提升汽车电子和工业控制领域的安全防护能力。

weixin_33925615的博客 380

android开发(31) 动画演示 - 从页面底部向上弹出dialog,消失时逐渐向下

我想实现一个效果,从底部向上逐渐弹出。如下图所示: 1.点击 显示 按钮时,一个dialog对话框从底部慢慢向上弹出。 2.关闭dialog时, dialog缓慢的移动向底部消失。很平滑的效果。         实现方式: 在activity中写代码如下 public class MainActivity extends Activity { Button button1;...

weixin_34024034的博客 315

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

推荐开源项目:SwipeAwayDialog - 轻松实现滑动消失对话框

在移动应用开发中,对话框(Dialog)是用户界面中不可或缺的元素,通常用于显示重要信息或者进行关键操作。而今天我要向大家推荐的是一款专为Android打造的开源库——SwipeAwayDialog。它提供了独特的功能,允许用户通过简单的滑动手势来关闭对话框,从而带来更流畅、更直观的交互体验。 ## 项目介绍 SwipeAwayDialog是由开发者kakajika创建的一款对话框扩展组件。它...

gitblog_00005的博客 375

三边定位的最小二乘法运用

已知:条件基站到移动台的距离D,基站的坐标(xi,yi,zi) 求:移动台的坐标(x,y,z) 运用最小二乘法的核心是找到最小二乘法的矩阵形式即 Ax=B 在本次实验中通过三边定位计算得到 A=[A;2*(xi-x1),2*(yi-y1),2*(zi-z1]; %系数矩阵A b=[b;D1^2-Di^2+xi^2+yi^2+zi^2-x1^2-y1^2-z1^2]; %增广矩阵b

qq_26250141的博客 1万+

PyCharm安装PyQt5及工具详细教程

PyCharm是一款功能强大的Python集成开发环境(IDE),而PyQt5是一个用于创建GUI应用程序的流行Python库。在本教程中,我将指导您如何在PyCharm中安装PyQt5及其相关工具,并提供相应的源代码示例。安装完成后,启动PyCharm并创建一个新的项目。为了隔离项目的依赖项,我们建议在PyCharm中使用虚拟环境。在创建项目的过程中,您可以选择创建新的虚拟环境或使用现有的环境。根据您的操作系统,选择适当的版本并按照安装向导的指示进行安装。首先,您需要下载并安装PyCharm。

CfProgram的博客 589

MFC中提示对话框的滑动弹出和程序图标加入系统托盘的实现

还是因为无聊,下面把提示对话框的滑动弹出和程序图标加入系统托盘的实现的效果先看下: 这个就是简单的效果,下面把实现的过程简单说一下: 1.提示对话框的滑动弹出: 首先自己添加个资源---提示对话框,下面就是怎样在响应消失时从桌面右下角滑动的显示出来: void CMyDlg::OnButtonTishi()  { // TODO: Add your co

ylo523的专栏 945

深度强化学习 | 基于SAC算法的移动机器人路径跟踪(附Pytorch实现)

软性演员-评论家(Soft Actor-Critic, SAC)算法是基于最大熵原理的离线策略方法,本节将基于深度强化学习中的SAC算法实现移动机器人的路径跟踪,介绍网络设计、动作空间设计和奖励函数设计,并提供Pytorch实现加深理解

FRIGIDWINTER的博客 5736

beeshell弹窗系统全解析:Modal、Dialog、Tip的交互设计指南

beeshell是一个基于React Native开发的高质量组件库,专注于为移动应用提供一致且易用的UI组件。其中弹窗系统作为用户交互的重要组成部分,包含Modal、Dialog和Tip三大核心组件,它们分别适用于不同的场景需求,共同构建了完整的移动端交互反馈体系。 ## 弹窗组件的应用场景与设计原则 移动端弹窗设计需要平衡功能性与用户体验,beeshell的弹窗系统遵循以下核心设计原则:

gitblog_00745的博客 980

FTU电科院检测学习笔记-规划

如果写到最后,还非常的有动力和兴趣,可能会举出一些特定的例子来,但不保证一定是这样。

sixtome 1101

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 50

jQuery UI库使用记录----dialog以及以下effects效果

jQuery的UI库中的dialog效果很不错,在这里记录一下简单的一些使用方式以及一些配置的参数意义: 简单的使用可以在jQuery UI的官方demo中看到,具体的使用方式如下: 在html文件中添加一个 在js文件中调用:$('#mydiv').dialog()即可,这样就可以创建一个最基本的dialog,在.dialog()方法中可以添加一些配置参数,如下

天镶的专栏 1902

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ruflo 中 V3 MCP 性能优化实战:连接池、工具注册表与亚 100ms 传输层改造

本文以 [.claude/skills/v3-mcp-optimization/SKILL.md](https://link.gitcode.com/i/90ce4308a29a5538d797dc6143302141) 为骨架,围绕 claude-flow v3 的 MCP(Model Context Protocol)服务端展开系统性性能优化讲解:从冷启动延迟、连接开销、工具查找与传输层四大瓶

gitblog_00343的博客 842

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

一个基于DialogFragment的图片浏览器

PictureBrowser 一个基于support.v4.app.DialogFragment的图片浏览器 地址:https://github.com/LinweiJ/PictureBrowser 特点: 图片浏览器,跟Dialog一样简单使用 基于DialogFragment , 支持横竖屏切换不消失 基于ViewPager+FragmentPagerAdapter,滑动流畅 基于P...

LinWeiJ的博客 979

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Snackbar

概述 Dialog和Toast,我们在日常的开发中一定非常熟悉,常常被用来作为Android应用内提示性信息的两种展示方式。然而Google在Design包中又提供了一种新的选择,那就是Snackbar。今天主要介绍Snackbar新控件的使用,以及三种提示信息展示方式的比较。 什么是Snackbar Snackbar 是 And...

binglan520的专栏 894

鸿蒙学习-功能组件(Dialog弹窗)

内置弹窗无法满足样式或功能需求时。

nam1d的博客 577

MFC友好信息提示类

如需转载请标明出处:http://blog.youkuaiyun.com/itas109 QQ技术交流群:129518033 本文实现了类似QQ弹出窗口的功能,并封装成类。 主要功能: 1、动画弹出,可以设置类型 2、弹出信息后自动消失。  3、可以设置字体大小和颜色。  4、设置窗口停留时间和显示类型。  5、不占用主窗口的焦点。 整个工程下载地址: http://d

itas109的专栏 1451

HeroUI Native弹窗与底部面板终极教程:Dialog、BottomSheet、Toast深度解析

HeroUI Native是一个美观、快速且现代的React Native UI库,提供了丰富的弹窗与底部面板组件,帮助开发者轻松构建高质量移动应用界面。本教程将深入解析Dialog、BottomSheet和Toast三大核心组件的使用方法,让你快速掌握移动应用中的交互设计精髓。 ## 为什么选择HeroUI Native弹窗组件? 在移动应用开发中,弹窗与底部面板是用户交互的重要组成部分。H

gitblog_00825的博客 510

ios 底部弹窗滑动_弹窗归纳(Dialog/Popover/Actionbar/Toast/Snackbars/HUD)

在此总结一下弹窗的类型和适用场景(以移动端为例),作为行业新人与大家共勉,有什么遗漏、错误之处还请大家指正,如有侵权(暂时确定没有)请联系删除,转载请注明原作者及文章出处。 弹窗是在用户当前所处页面出现的提示、引导操作的内容,其包含模态与非模态两种类型,如图。一、模态弹窗 用户必须先与当前弹窗进行交互,之后才能进行其它操作,这种弹窗就是模态的。其类型如下:...

weixin_39583013的博客 1333
上一篇: View源码之scrollBy()、scrollTo()解析
下一篇: Android Telephone
zdj_develop
博客等级 码龄11年 56粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值