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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

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

效果图:

怎么用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 studio怎么实现弹窗提醒功能

要在Android Studio中实现弹窗提醒功能,可以使用AlertDialog类。下面是一个简单的示例代码:```javaAlertDialog.Builder builder = new AlertDialog.Builder(thi
2023-08-08

android多窗口模式怎么实现

Android多窗口模式可以通过以下几个步骤实现:1. 在AndroidManifest.xml文件中声明`android:resizeableActivity="true"`属性,以允许应用程序在多窗口模式下运行。2. 在`onCreat
2023-09-18

Android怎么实现可拖动层叠卡片布局

本篇内容主要讲解“Android怎么实现可拖动层叠卡片布局”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么实现可拖动层叠卡片布局”吧!公司app要求做一个扭蛋功能,其实就是一个可
2023-06-25

怎么实现Android TV 3D卡片无限循环效果

这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!##思路自定义Vi
2023-06-25

在Android应用中怎么利用dialog实现一个支付密码界面弹窗

这篇文章将为大家详细讲解有关在Android应用中怎么利用dialog实现一个支付密码界面弹窗,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现过程1,先写xml文件:dialog_keyb
2023-05-31

javascript怎么使用alert实现一个精美的弹窗

这篇文章主要讲解了“javascript怎么使用alert实现一个精美的弹窗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript怎么使用alert实现一个精美的弹窗”吧!一、为
2023-07-05

怎么使用Android Flutter实现弹幕效果

本篇内容介绍了“怎么使用Android Flutter实现弹幕效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言需求要点如下:弹幕行数为
2023-07-02

Android怎么实现图片设置圆角形式

这篇文章主要讲解了“Android怎么实现图片设置圆角形式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么实现图片设置圆角形式”吧!1.自定义的图片圆角形式CircleIma
2023-06-21

Android 中怎么利用ScrollView实现反弹效果

本篇文章给大家分享的是有关Android 中怎么利用ScrollView实现反弹效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。自定义ScrollView控件:/** *
2023-05-30

Android中怎么利用EasyBarrage实现一个弹幕效果

Android中怎么利用EasyBarrage实现一个弹幕效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述EasyBarrage是Android平台的一种轻量级弹幕效
2023-05-30

Android怎么用Palette实现提取图片颜色

本文小编为大家详细介绍“Android怎么用Palette实现提取图片颜色”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么用Palette实现提取图片颜色”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
2023-06-29

Android应用中怎么实现利用图片路径查看图片

Android应用中怎么实现利用图片路径查看图片?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.在项目清单中添加网络访问权限
2023-05-31

vue中怎么使用h5 video标签实现弹窗播放本地视频

这篇“vue中怎么使用h5 video标签实现弹窗播放本地视频”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue中怎么使用
2023-06-30

Android Flutter怎么使用相机实现拍摄照片

本篇内容介绍了“Android Flutter怎么使用相机实现拍摄照片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用相机前的准备工作fl
2023-07-05

怎么在css3中利用column实现卡片瀑布流布局

这篇文章将为大家详细讲解有关怎么在css3中利用column实现卡片瀑布流布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。相关属性column-count:想实现的列数,我这里只需要2列c
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录