1. 程式人生 > >PopupWindow實現任意位置動畫顯隱

PopupWindow實現任意位置動畫顯隱

       現在專案中要實現導航欄(標題欄)下顯示一個下拉選單,從上往下的平移動畫。原生PopupWindow的setAnimationStyle設定的動畫都是從螢幕外面滑入螢幕內的動畫效果,選單顯示動畫過程中會發現是從導航欄上面滑過的,達不到我們要的效果。只好自己想辦法實現這個動畫效果了,然後花了點時間簡單封裝了一個。完整原始碼貼在下面,比較簡單,所以不多做解釋了。有問題也希望大家指出,主要是為了穩定和方便使用。 原始碼: package com.android.myapplication; import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout; /**
 * Author: zls.
 * Created on 2016/4/22 21:02.
 */
public class PopupWindow {     private static Handler handler;
    private static xWindow popupWindow;
    private static long DURATION = 0;     public static void showAtLocation(Context context, View v, int x, int y){
        showAtLocation(context, v, x, y, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }     public static void showAtLocation(Context context, View v, int x, int y, int[] anim){
        int enterAnim = 0, exitAnim = 0;
        if(anim.length > 0) enterAnim = anim[0];
        if(anim.length > 1) exitAnim = anim[1];
        showAtLocation(context, v, x, y, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, enterAnim, exitAnim);
    }     public static void showAtLocation(Context context, View v, int x, int y, int width, int height){
        showAtLocation(context, v, x, y, width, height, 0, 0);
    }     public static void showAtLocation(Context context, View v, int x, int y, int width, int height, int enterAnim, int exitAnim){
        if(context == null || !(context instanceof Activity) || null == v) return;
        close();
        initView(context, v, width, height, enterAnim, exitAnim);
        popupWindow.showAtLocation(v, 0, x, y);
    }     public static void showAsDropDown(Context context, View anchor, final View v){
        showAsDropDown(context, anchor, v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }     public static void showAsDropDown(Context context, View anchor, View v, int[] anim){
        int enterAnim = 0, exitAnim = 0;
        if(anim.length > 0) enterAnim = anim[0];
        if(anim.length > 1) exitAnim = anim[1];
        showAsDropDown(context, anchor, v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, enterAnim, exitAnim);
    }     public static void showAsDropDown(Context context, View anchor, View v, int width, int height){
        showAsDropDown(context, anchor, v, width, height, 0, 0);
    }     public static void showAsDropDown(Context context, View anchor, View v, int width, int height, int enterAnim, int exitAnim){
        if(context == null || !(context instanceof Activity) || null == v) return;
        close();
        initView(context, v, width, height, enterAnim, exitAnim);
        popupWindow.showAsDropDown(anchor);
    }     private static void initView(Context context, final View v, int width, int height, int enterAnim, int exitAnim){
        FrameLayout frame = new FrameLayout(context);
        frame.addView(v);
        popupWindow = new xWindow(frame, width, height);
        popupWindow.setFocusable(true);
        popupWindow.setTouchable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00000000")));         DURATION = 0;
        if(exitAnim > 0) {
            final Animation exitAnimation = AnimationUtils.loadAnimation(context, exitAnim);
            DURATION = exitAnimation.getDuration();
            popupWindow.setOnPreDismissListener(new Runnable() {
                @Override
                public void run() {
                    v.startAnimation(exitAnimation);
                }
            });
        }
        if(enterAnim > 0) {
            Animation animation = AnimationUtils.loadAnimation(context, enterAnim);
            v.startAnimation(animation);
        }
        handler = new Handler(context.getMainLooper());
    }     public static void close(){
        if(popupWindow != null){
            popupWindow.dismiss();
            popupWindow = null;
            handler = null;
        }
    }     private static class xWindow extends android.widget.PopupWindow{         private Runnable onPreDismissListener;         public xWindow(View v, int w, int h){
            super(v, w, h);
        }         @Override
        public void dismiss() {
            if(null != onPreDismissListener){
                onPreDismissListener.run();
            }
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    xWindow.super.dismiss();
                }
            }, DURATION);
        }         public void setOnPreDismissListener(Runnable onPreDismissListener) {
            this.onPreDismissListener = onPreDismissListener;
        }
    } } PS:第一篇博文,正在加班,沒辦法花很多時間來寫了,畢竟也比較簡單。因為在網上找不到相關的文章,所以只好通過自己的辦法去實現了,希望可以幫到一些剛入門的朋友。

相關推薦

PopupWindow實現任意位置動畫

       現在專案中要實現導航欄(標題欄)下顯示一個下拉選單,從上往下的平移動畫。原生PopupWindow的setAnimationStyle設定的動畫都是從螢幕外面滑入螢幕內的動畫效果,選單顯示動畫過程中會發現是從導航欄上面滑過的,達不到我們要的效果。只好自己想辦法

利用css transition屬性實現一個帶動畫的微信小程式部件

我們先來看效果圖像這樣的一個帶過渡效果的小部件在我們實際開發中的應用機率還是比較大的,但是在開發微信小程式的過程中可能有的小夥伴發現transition這個屬性它不好使(下面說明)所以我們這個時候會考慮去使用微信官方提供的wx.createAnimation  API來建立動

python專案實戰:實現任意位置檔案分割

前言 在嵌入式開發中,常常需要將一個binary檔案分割成多個檔案,或者將一個binary的某塊區域抓成一個單獨檔案。本篇blo

元素切換過渡效果的實現

使用 方法 drs 想法 避免 qpi 子函數 設定 sna 近來看到 餓了麽 App和 h5站上,在商家詳情頁點餐之後,底部放置了一個點擊之後能夠彈出模態框查看點餐詳情的元素,其中有個背景遮罩層的漸進顯隱的效果。 憑著我少許的經驗,第一時間的想法是覺得這個遮罩層應該

JS/jquery實現鼠標控制頁面元素

前端最近因為公司網站要上一個活動廣告橫幅,當用戶鼠標劃過時顯隱二維碼。像這種鼠標事件控制頁面元素顯隱的情況,碼農們會經常遇到,可以通過javascript或jquery代碼實現,下面就幾種常見需求一起歸納一下。mouseout和mouseleave這裏需要特別註意mouseout與mouseleave的區別。

Vue-cli中使用vConsole,以及設定JS連續點選控制vConsole按鈕功能實現

一、vue-cli腳手架中搭建的專案引入vConsole除錯 1.首先npm安裝,大家都懂的。 npm install vconsole 2.在合適的地方新建一個檔案vconsole.js,內容如下: import Vconsole from 'vconsole' let vConso

Vue-cli中使用vConsole,以及設置JS連續點擊控制vConsole按鈕功能實現

vco from main date export lse 發包 操作 前端開發 一、vue-cli腳手架中搭建的項目引入vConsole調試 1.首先npm安裝,大家都懂的。 npm install vconsole 2.在合適的地方新建一個文件vconsole.js

WPF MVVM模式中,通過命令實現窗體拖動、跳轉以及控制

原文: WPF MVVM模式中,通過命令實現窗體拖動、跳轉以及顯隱控制 在WPF中使用MVVM模式,可以讓我們的程式實現介面與功能的分離,方便開發,易於維護。但是,很多初學者會在使用MVVM的過程中遇到一個顯而易見且無法迴避的問題,那就是不同的窗體之間如何跳轉?很多人在介紹MVVM的使用時,都沒有明顯提到該

jquery特效 動畫 事件

顯隱特效 $btn.click(function(){         $('#div1').fadeIn(  1000,'swing',function(){ alert('done!');&n

核心連結串列實現任意兩個節點交換位置

#include <stdio.h> #include "list.h" //list.h這個檔案需要你自己打造,可以拷貝核心原始碼,也可以參考我的博文 struct data_info { int data; struct list_head list; }; in

Unity實現滑鼠點選地面的任意位置,則角色會立即走到滑鼠點選的位置

一、建立一個角色,並給角色新增 CharacterController 控制器,這裡以簡單的Capsule物體作為角色示例,如下所示: 二、編寫控制角色移動的指令碼  RayDemo2_CCWalking.cs /*** * * Title: * 射

C語言使用memcpy函式實現兩個數間任意位置的複製操作

  c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。   用法:void *memcpy(void *dest, const void *src, size_t n); 舉例:   char tes

利用二次賦值變數,實現不同點擊——wepy框架

  點選當前A標題,傳送請求展示下拉框,再次點選A隱藏下拉框 點選B標題傳送請求展示下拉框,再次點選A隱藏下拉框 特殊要求: 當A展開時,點選B,要求:A的下拉框隱藏,B的下拉框展示 遇到的困難: 點選B時,A不會自動隱藏。 或者 點選A時,A無法手動隱藏

【Javascript學習筆記】【DOM實戰— —jQ實現點選任意位置關閉某處的效果(常用於模態框後面的遮罩層)】

【Javascript學習筆記】 目錄 目錄 原理 效果 程式碼 實戰程式碼 快捷連結 點選任意位置關閉某處 而且點選對應處並不會hide掉自己 原理

PopupWindow實現彈窗,可以任意自定義佈局

用於實現彈窗,可以任意自定義佈局,android中彈窗可以分為AlertDialog和popupWindow,AlertDialog只能顯示固定在中間位置,popupWindow可以在任意位置,相對更加靈活。 1.主佈局設定 <Button

Android下圖片或按鈕等可拖動到任意位置的效果實現原始碼

from: http://www.2cto.com/kf/201207/140218.html Android下圖片可拖動到任意位置的效果 下面為Activity的程式碼: 01 public class DraftTest extends Activity { 0

springmvc專案中實現靜態檔案對映任意位置

專案釋出後一般圖片都是儲存在檔案伺服器中的。或者再做開發的時候我們是將上傳的圖片儲存在電腦中某個資料夾,專案啟動後直接訪問的話只能使用file://這種方式訪問,當然不靠譜。所以我們使用到了springmvc中的mvc:resource標籤 首先需要修改一下w

Java實現任意位置截圖(仿QQ截圖)

最近剛剛學完java,就做了這個小程式。當然,也是通過百度查詢資料,最後做出了這一個小程式。 功能: 點選截圖按鈕,就開始截圖,在螢幕上畫出一個區域之後,就可以通過雙擊將圖片儲存到桌面。如果不想截圖,就右鍵滑鼠,退出程式。 我的是win10系統,所以桌面的地址是:C:\\U

基於Python單向連結串列實現尾部、任意位置新增,刪除

# coding = utf-8 # 建立節點類 class Node(object):     def __init__(self, data):         # 定義指向域         self.next = None         # 定義資料域      

iOS事件攔截(實現觸控任意位置隱藏指定view)

最開始的想法是當這個選擇器(selectorView)展開的時候,在當前螢幕上加入一個鋪滿整個螢幕的透明button來攔截所有的觸控事件。 可是這個方案實現起來非常麻煩,也不優雅,而且發現button攔截不到scrollView的滑動事件,所以決定放棄。 後來經過經理提醒,在UIApplication下有一