我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android PopUpWindow实现卡片式弹窗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android PopUpWindow实现卡片式弹窗

在这里插入图片描述

首先自定义一个ViewGroup,继承自LinerLayout,为了实现上下滑动

//用于实现顶部弹窗动画  以及向上滑动动画
public class TopTipsLinearLayout extends LinearLayout {

    private static final String TAG = "Hyh";

    private int mHeight;
    private boolean mIsFirstLayout=true;
    private boolean mIsPalyingAnimation=false;
    private int mLastY=0;
    private int mLastX=0;
    private final int mTouchSlop = 4;
    private final long SINGLE_CLICK_TIME = 300;
    private long beginTiem=0;
    private boolean mIsMoving=false;

    public TopTipsLinearLayout(Context context) {
        super(context);
    }

    public TopTipsLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public TopTipsLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public TopTipsLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if(mIsFirstLayout) {
            mHeight = getHeight();
            mIsFirstLayout = false;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mIsMoving = false;
                beginTiem = System.currentTimeMillis();
                break;
            case MotionEvent.ACTION_MOVE:
                int deltay = (int)event.getRawY() - mLastY;
                if(!mIsPalyingAnimation) {
                    if(deltay < 0 || getTranslationY() + deltay <= 0) {
                        setTranslationY(getTranslationY() + deltay);
                    }
                }
                if(isMove(event.getRawX(), event.getRawY())) {
                    mIsMoving = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                if(System.currentTimeMillis() - beginTiem <= SINGLE_CLICK_TIME && !mIsMoving) {
                    performClick();
                }
                mIsMoving = false;
                if(Math.abs(getTranslationY()) <= (float) mHeight/3) {
                    setTranslationY(0);
                } else {
                    fadeOutAnimator(200);
                }
                break;
        }
        mLastY = (int)event.getRawY();
        mLastX = (int)event.getRawX();
        return true;
    }

    private boolean isMove(float curX,float curY) {
        return Math.abs(curX - mLastX) >= mTouchSlop || Math.abs(curY - mLastY) >= mTouchSlop;
    }

    public void showEnterAnimator(long time) {
        setVisibility(VISIBLE);
        //向下移动动画
        TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,-mHeight, 0);
        downTranslateAnimation.setDuration(time);
        downTranslateAnimation.setFillAfter(true);

        mIsPalyingAnimation = true;
        startAnimation(downTranslateAnimation);

        downTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                mIsPalyingAnimation = false;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

    public void fadeOutAnimator(long time) {
        if(mIsMoving) {
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    fadeOutAnimator(300);
                }
            }, 1500);
            return ;
        }
        //向上移动动画
        TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,0, -mHeight - getTranslationY());
        downTranslateAnimation.setDuration(time);
        downTranslateAnimation.setFillAfter(true);

        mIsPalyingAnimation = true;
        startAnimation(downTranslateAnimation);

        //动画监听
        downTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {}
            @Override
            public void onAnimationEnd(Animation animation){
                setVisibility(GONE); //动画结束 消除视图
                mIsPalyingAnimation = false;
            }
            @Override
            public void onAnimationRepeat(Animation animation) {}
        });
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    }
}

定义一个layout文件

<?xml version="1.0" encoding="utf-8"?>
<com.example.randfood.customview.TopTipsLinearLayout
    android:id="@+id/top_tips_root"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:visibility="invisible">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是一个消息弹窗"
        android:layout_gravity="center_horizontal"
        android:textSize="30sp"
        android:padding="20dp"
        android:background="@drawable/messageview_top_pop_bg"/>

</com.example.randfood.customview.TopTipsLinearLayout>

调用下面的方法即可

private static void initPopUpWindow(Context context, View parentView) {
        View view = View.inflate(context, R.layout.messageview_top_pop, null);
        PopupWindow popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, false);
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        popupWindow.setOutsideTouchable(false);
        //让popupwindow可以显示在状态栏中
        popupWindow.setClippingEnabled(false);
//        popupWindow.setTouchable(true);
        popupWindow.showAtLocation(parentView, Gravity.TOP, 0, 0);
        TopTipsLinearLayout layout = view.findViewById(R.id.top_tips_root);
        //让viewgroup中的内容显示在状态栏下面
        layout.setPadding(0, DisplayUtil.getStatusBarHeight(context), 0, 0);
        layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "你点击了顶部消息", Toast.LENGTH_SHORT).show();
            }
        });
        layout.post(new Runnable() {
            @Override
            public void run() {
                layout.showEnterAnimator(300);
            }
        });
        layout.postDelayed(new Runnable() {
            @Override
            public void run() {
                layout.fadeOutAnimator(300);
            }
        }, 5000);
    }

到此这篇关于Android PopUpWindow实现卡片式弹窗的文章就介绍到这了,更多相关Android PopUpWindow弹窗内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android PopUpWindow实现卡片式弹窗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用Android PopUpWindow实现卡片式弹窗

这篇文章主要讲解了“怎么用Android PopUpWindow实现卡片式弹窗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Android PopUpWindow实现卡片式弹窗”吧!效
2023-06-28

android PopupWindow 和 Activity弹出窗口实现方式

本人小菜一个。目前只见过两种弹出框的实现方式,第一种是最常见的PopupWindow,第二种也就是Activity的方式是前几天才见识过。感觉很霸气哦。没想到,activity也可以做伪窗口。 先贴上最常见的方法,主要讲activity的方
2022-06-06

Android popupWindow弹出窗体实现方法分析

本文实例讲述了Android popupWindow弹出窗体实现方法。分享给大家供大家参考,具体如下:1. 建立popupwindow显示的布局页面(普通的view任意布局)2023-05-31

Android编程实现的自定义弹窗(PopupWindow)功能示例

本文实例讲述了Android编程实现的自定义弹窗(PopupWindow)功能。分享给大家供大家参考,具体如下: 在开发过程中,如果要弹出一个对话框,一般是使用AlertDialog,但其使用限制太大,灵活性不够,所以我们常需要用到灵活性更
2022-06-06

Android简单实现自定义弹框(PopupWindow)

一:一般都是先上效果图二:实现步骤: 1.xml布局实现 2022-06-06

Android开发实现popupWindow弹出窗口自定义布局与位置控制方法

本文实例讲述了Android开发实现popupWindow弹出窗口自定义布局与位置控制方法。分享给大家供大家参考,具体如下:布局文件:主布局文件:activity_main:2023-05-30

Android弹出窗口实现方法

本文实例讲述了Android弹出窗口实现方法。分享给大家供大家参考,具体如下: 直接上代码:/** * 弹窗--新手指引 * @param cxt * @param id 资源编号 * @create_time 2011-7-27 下午0
2022-06-06

Android实现底部弹窗效果

本文实例为大家分享了Android实现底部弹窗效果的具体代码,供大家参考,具体内容如下源代码地址:https://github.com/luoye123/Box东西很简单,我就直接亮代码了: 1、activity_main.xml
2023-05-31

Android实现底部半透明弹出框PopUpWindow效果

Android底部半透明弹出框PopUpWindow,供大家参考,具体内容如下layout布局:2023-05-30

Android Studio如何实现弹窗设置

这篇文章主要介绍“Android Studio如何实现弹窗设置”,在日常操作中,相信很多人在Android Studio如何实现弹窗设置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android Studi
2023-06-30

Android PopupWindow实现右侧、左侧和底部弹出菜单

本教程为大家分享了Android PopupWindow弹出菜单的具体代码,供大家参考,具体内容如下项目代码:http://xiazai.jb51.net/201611/yuanma/PopupLeftMenu(jb51.net).rar
2022-06-06

Android之用PopupWindow实现弹出菜单的方法详解

在使用UC-WebBrowser时,你会发现它的弹出菜单跟系统自带的菜单不一样。它实现更多菜单选项的显示和分栏。其实,它的本身是PopupWindow或者是AlertDialog对话框,在里面添加两个GridView控件,一个是菜单标题栏,
2022-06-06

Android实现底部弹出PopupWindow背景逐渐变暗效果

在Android开发中,经常需要通过点击某个按钮弹出对话框或者选择框,通过Dialog或者PopupMenu、PopupWindow都能实现。 这里主要介绍后两者:PopupMenu、PopupWindow的实现。 先看两个效果图上边Po
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录