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弹窗内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android PopupWindow实现左侧弹窗效果

    本文实例为大家分享了Android PopupWindow实现左侧弹窗的具体代码,供大家参考,具体内容如下 效果图: MainActivity.java页面核心代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在setContentView之前添加,未添加的话home键监听无效,设置窗体属性 this.getWindow().setFlags(0x80000

  • Android弹窗ListPopupWindow的简单应用详解

    概述 常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow 如果只是展示列表数据或者弹窗列表选择,直接使用ListPopupWindow即可,不用再单独去设置布局. 如果想要更加多样化的那就自定义一个布局,使用PopupWindow即可,也不复杂. 用法 自定义ListPopupWindow类 public class ChargeItemSumPop extends ListPopupWindow { public ChargeItemSumPop(Conte

  • Android使用 PopupWindow 实现底部弹窗功能

    一.知识点 不详细展开 PopupWindow 或者视图动画的所有具体使用方式,仅仅介绍一下使用的一个大概流程和一些知识要点,具体的介绍在下面设计实现中讲述 (一)PopupWindow 1. 初始化 加载弹窗的布局 实例化 PopupWindow 传入布局和弹窗的宽高 对布局里面的控件的操作 对布局本身的一些设置 // 加载弹窗的布局 pwView = LayoutInflater.from(this).inflate(R.layout.pw_search_engine, null, fals

  • Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用PopupWindow 创建对话框风格的串口秩序如下两步即可: 1. PopupWindow 的构造器创建PopupWindow对象 2. PopupWindow 的showAsDropDown() 将其显示效果设置为下拉显示 3. PopupWindow 的showAtLoacation() 方法将

  • Android PopUpWindow实现卡片式弹窗

    首先自定义一个ViewGroup,继承自LinerLayout,为了实现上下滑动 //用于实现顶部弹窗动画 以及向上滑动动画 public class TopTipsLinearLayout extends LinearLayout { private static final String TAG = "Hyh"; private int mHeight; private boolean mIsFirstLayout=true; private boolean mIsPalyingA

  • Android实现层叠卡片式banner

    本文实例为大家分享了Android实现层叠卡片式banner的具体代码,供大家参考,具体内容如下 效果图如下: 背景 由于公司VIP模块项目需要,本着对ui设计师的尊重,需要实现以上效果图,在网上找了很多博客,都不能满足上面的需求,所以就只能自己硬着头皮自定义了,下面就是我自定义的view代码,做个记录: package cn.com.cunw.familydesk.view.vipBanner; import android.animation.Animator; import android

  • Android仿探探卡片式滑动效果实现

    前言 第一次进入探探软件界面,就被这种通过卡片式滑动来选择"喜欢/不喜欢"的设计所吸引了.当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果的原理肯定和 ListView / RecyclerView 类似,涉及到 Item View 的回收和重用,否则早就因为大量的 Item View 而 OOM 了. 再到后来,看到许多大神也推出了同样仿探探效果的博客,从头到尾阅读下来,写得通俗易懂,基本上没什么问题.于是,实现仿探探效果的想法再次出现在脑海

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

    本文实例讲述了Android编程实现的自定义弹窗(PopupWindow)功能.分享给大家供大家参考,具体如下: 在开发过程中,如果要弹出一个对话框,一般是使用AlertDialog,但其使用限制太大,灵活性不够,所以我们常需要用到灵活性更高的PopupWindow, 如图,当点击显示的时候,就会弹出一个对话框,当点击确定或屏幕其它任意地方,就可以将PopupWindow取消了,接下来贴出重要代码. PopupWindow pw = new PopupWindow(view.getContext

  • RecyclerView+CardView实现横向卡片式滑动效果

    现在来介绍两种控件RecyclerView和CardView,并通过实例将它们结合在一起实现一种横向卡片式滑动效果. 1.RecyclerView RecyvlerView是android SDK 新增加的一种控件,也被官方推荐代替ListView来使用,因为其具有更好的灵活性和代替性. 2.CardView CardView是安卓5.0推出的一种卡片式控件,内部封装了许多有用的方法来实现美观效果. 3.如何使用RecylerView和CardView在android studio中 在buil

  • js实现卡片式项目管理界面UI设计效果

    这是一款非常有创意的卡片式项目管理界面UI设计效果.该UI设计中,将各个项目以卡片的方式堆叠排列在屏幕上,当点击了其中的某个项目的时候,该项目图片会全屏放大,向下滚动鼠标可以看到该项目的介绍信息. 该项目管理界面还提供了一个全屏的导航菜单,用户可以通过右上角的汉堡包图标来触发全屏菜单. 使用方法 HTML结构 该卡片式项目管理界面的HTML结构分为3个部分:.cd-nav-trigger是全屏菜单的触发按钮,nav.cd-primary-nav是全屏导航菜单,.cd-projects-conta

  • Android获取SD卡上图片和视频缩略图的小例子

    如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri,这里保存着Android手机SD卡上的多媒体文件完整路径. [java] 复制代码 代码如下: Uri originalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                 //若为视频则为MediaStore.Video.Media.EXTERNAL_CONTENT_URI;          

  • Android获取SD卡路径及SDCard内存的方法

    本文实例讲述了Android获取SD卡路径及SDCard内存的方法.分享给大家供大家参考.具体分析如下: 昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程序的图片存储路径); 后来发现这样写虽然一般不会出错,但不是很好,因为不同相机,可能路径会出问题.较好的方法是通过Environment 来获取路径,最后给出一个例子,教你怎样获取SDCard 的内存,显示出来告诉用

  • Android PopupWindow被输入法弹上去之后无法恢复原位的解决办法

    问题描述: 我的PopupWindow位于屏幕底部,它上面有一个EditText输入框,而当我点击这个EditText的时候,随着输入法的弹出,我的PopupWindow也会随着上升,但是当我结束输入,关闭输入法的时候,PopupWindow却没有随着输入法一下下滑,而是停在屏幕中间,下面显示的是Activity的背景色.(小米手机上出现,三星note上没有出现) 解决办法: 给PopupWindow增加一个属性:popWindow.setSoftInputMode(WindowManager.

随机推荐