Android Animation实战之屏幕底部弹出PopupWindow

Android动画的一个实战内容,从屏幕底部滑动弹出PopupWindow。 相信这种效果大家在很多APP上都遇到过,比如需要拍照或者从SD卡选择图片,再比如需要分享某些东西时,大多会采用这么一种效果:

那这种效果如何实现呢?
我们仿写一个这种效果的实例吧:

1)我们首先定义一下,弹出窗口的页面布局组件:take_photo_pop.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_horizontal"
  android:orientation="vertical"> 

  <LinearLayout
    android:id="@+id/pop_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:layout_alignParentBottom="true"
    android:gravity="center_horizontal"
    android:orientation="vertical"> 

    <TextView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:clickable="false"
      android:gravity="center"
      android:text="修改头像"
      android:textColor="#8a8a8a"
      android:textSize="15sp" /> 

    <View
      android:layout_width="fill_parent"
      android:layout_height="0.1dp"
      android:layout_marginLeft="10dp"
      android:layout_marginRight="10dp"
      android:background="#00c7c0" /> 

    <Button
      android:id="@+id/btn_take_photo"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="拍照"
      android:textColor="#0e61aa"
      android:textSize="18sp" /> 

    <Button
      android:id="@+id/btn_pick_photo"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="从相册选择"
      android:textColor="#0e61aa"
      android:textSize="18sp" /> 

    <Button
      android:id="@+id/btn_cancel"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_marginBottom="15dip"
      android:layout_marginTop="15dip"
      android:text="取消"
      android:textColor="#0e61aa"
      android:textSize="18sp"
      android:textStyle="bold" />
  </LinearLayout> 

</RelativeLayout>

2)现在定义动画,要知道该Popupwindow出现时是从页面底部向上滑动,消失时是从上向下滑动消失,,所以我们需要定义两个动画文件:
退出动画pop_exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="50%p" />
  <alpha
    android:duration="200"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" />
</set>
显示动画pop_enter_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

  <translate
    android:duration="200"
    android:fromYDelta="100%p"
    android:toYDelta="0" />
  <alpha
    android:duration="200"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />
</set>

关于这两个动画,此处不再多做解析,读过我之前博文的都应该知道啦,很简单的,若是看不懂?请点击此文上方的链接学习之。
3)自定义弹出框Popupwindow:

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.RelativeLayout; 

public class TakePhotoPopWin extends PopupWindow { 

  private Context mContext; 

  private View view; 

  private Button btn_take_photo, btn_pick_photo, btn_cancel; 

  public TakePhotoPopWin(Context mContext, View.OnClickListener itemsOnClick) { 

    this.view = LayoutInflater.from(mContext).inflate(R.layout.take_photo_pop, null); 

    btn_take_photo = (Button) view.findViewById(R.id.btn_take_photo);
    btn_pick_photo = (Button) view.findViewById(R.id.btn_pick_photo);
    btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
    // 取消按钮
    btn_cancel.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) {
        // 销毁弹出框
        dismiss();
      }
    });
    // 设置按钮监听
    btn_pick_photo.setOnClickListener(itemsOnClick);
    btn_take_photo.setOnClickListener(itemsOnClick); 

    // 设置外部可点击
    this.setOutsideTouchable(true);
    // mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
    this.view.setOnTouchListener(new View.OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 

        int height = view.findViewById(R.id.pop_layout).getTop(); 

        int y = (int) event.getY();
        if (event.getAction() == MotionEvent.ACTION_UP) {
          if (y < height) {
            dismiss();
          }
        }
        return true;
      }
    }); 

    /* 设置弹出窗口特征 */
    // 设置视图
    this.setContentView(this.view);
    // 设置弹出窗体的宽和高
    this.setHeight(RelativeLayout.LayoutParams.MATCH_PARENT);
    this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT); 

    // 设置弹出窗体可点击
    this.setFocusable(true); 

    // 实例化一个ColorDrawable颜色为半透明
    ColorDrawable dw = new ColorDrawable(0xb0000000);
    // 设置弹出窗体的背景
    this.setBackgroundDrawable(dw); 

    // 设置弹出窗体显示时的动画,从底部向上弹出
    this.setAnimationStyle(R.style.take_photo_anim); 

  }
}

定义要弹出的组件TakePhotoPopWin,它继承自PopupWindow,具体如何实现的,我备注信息很详细了。 有一个地方要提醒的是,就是最后要设置弹出窗体的显示动画,this.setAnimationStyle(R.style.take_photo_anim); 这是必不可少的,只有加上了它,才能应用动画效果!
看下take_photo_anim style的定义:

<style name="take_photo_anim" parent="android:Animation">
    <item name="android:windowEnterAnimation">@anim/pop_enter_anim</item>
    <item name="android:windowExitAnimation">@anim/pop_exit_anim</item>
</style>

就这么几步,一个可以从屏幕底部滑动弹出的组件

public void showPopFormBottom(View view) {
  TakePhotoPopWin takePhotoPopWin = new TakePhotoPopWin(this, onClickListener);
  //showAtLocation(View parent, int gravity, int x, int y)
  takePhotoPopWin.showAtLocation(findViewById(R.id.main_view), Gravity.CENTER, 0, 0);
} 

private View.OnClickListener onClickListener = new View.OnClickListener() {
  @Override
  public void onClick(View v) { 

    switch (v.getId()) {
      case R.id.btn_take_photo:
        System.out.println("btn_take_photo");
        break;
      case R.id.btn_pick_photo:
        System.out.println("btn_pick_photo");
        break;
    }
  }
};

这下子,效果就和我一开始传的图一致啦!有木有学会了呢!?

拓展:
     玩过APP的大家都知道,在你进入新页面或者注册登录啥的时候,都会弹出一个等待的框框,表示网络请求中,你需要耐心等待下,比如微信的等待请求框效果如下:

这里面其中也有个地方用到了动画,那就是不停旋转的那个小图标,它其实用的就是旋转动画!
    关于如何实现这么样一个旋转等待框,我以前写过一篇介绍的文章,可查看: 《Android自定义ProgressDialog进度等待框》

(0)

相关推荐

  • Android入门之PopupWindow用法实例解析

    本文实例介绍一下PopupWindow对话框.PopupWindow是阻塞对话框,只有在外部线程 或者 PopupWindow本身做退出操作才可以执行.PopupWindow完全依赖Layout做外观,在常见的开发中,PopupWindow应该会与AlertDialog常混用. 先贴出本例中运行的结果图: main.xml的源码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln

  • Android编程实现popupwindow弹出后屏幕背景变成半透明效果

    本文实例讲述了Android编程实现popupwindow弹出后屏幕背景变成半透明效果的方法.分享给大家供大家参考,具体如下: android中popupwindow弹出后,屏幕背景变成半透明这个效果很普通.实现的方法也很多.我使用的可能是最简单的一种,就是设置一下getWindows的透明度.不多说上代码 /** * 设置添加屏幕的背景透明度 * @param bgAlpha */ public void backgroundAlpha(float bgAlpha) { WindowManag

  • Android中PopupWindow响应返回键并关闭的2种方法

    PopupWindow 跟我们的 Activity 不一样,因为我们在构造 PW 的时候往往不是继承来的,而是 new 出来的.所以不能使用重写 PW 的 onKeyDown() 之类的方法来截获键盘事件.好在 PW 本身的特性让我们很容易就能做到用返回键来退出,当然我们也可以截获键盘事件,这样就有两种方法了.   方法一: 最简单的方法 在 new 的时候,使用下面的方法: 复制代码 代码如下: popupWindow = new PopupWindow(popupWindow_view, 2

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

    在使用UC-WebBrowser时,你会发现它的弹出菜单跟系统自带的菜单不一样.它实现更多菜单选项的显示和分栏.其实,它的本身是PopupWindow或者是AlertDialog对话框,在里面添加两个GridView控件,一个是菜单标题栏,一个是菜单选项.菜单选项视图的切换可以通过适配器的变换,轻松地实现.点击下载该实例:一.运行截图:           二.实现要点:(1)屏蔽系统弹出的菜单:1.首先创建至少一个系统的菜单选项 复制代码 代码如下: @Override public bool

  • Android中自定义PopupWindow实现弹出框并带有动画效果

    使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends PopupWindow { public Lost lost; public void onLost(Lost lost){ this.lost = lost; } private View conentView; public View getConentView() { return conentView; } public L

  • Android PopupWindow 点击外面取消实现代码

    private void showPopupView() { if (mPopupWindow == null) { View view = getLayoutInflater().inflate(R.layout.newest_layout, null); mPopupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mPopupWindow.setFocusable(tr

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

    本人小菜一个.目前只见过两种弹出框的实现方式,第一种是最常见的PopupWindow,第二种也就是Activity的方式是前几天才见识过.感觉很霸气哦.没想到,activity也可以做伪窗口. 先贴上最常见的方法,主要讲activity的方法. 一.弹出PopupWindow 复制代码 代码如下: /** * 弹出menu菜单 */ public void menu_press(){ if(!menu_display){ //获取LayoutInflater实例 inflater = (Layo

  • Android PopupWindow实现左侧弹窗效果

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

  • android popwindow实现左侧弹出菜单层及PopupWindow主要方法介绍

    PopupWindow可以实现浮层效果,主要方法有:可以自定义view,通过LayoutInflator方法:可以出现和退出时显示动画:可以指定显示位置等. 为了将PopupWindow的多个功能展现并力求用简单的代码实现,编写了一个点击按钮左侧弹出菜单的功能,实现出现和退出时显示动画效果并点击其他区域时弹出层自动消失,效果图如下: 源码: 1.PopwindowOnLeftActivity.java 复制代码 代码如下: package com.pop.main; import android

  • android使用PopupWindow实现页面点击顶部弹出下拉菜单

    实现此功能没有太多的技术难点,主要通过PopupWindow方法,同时更进一步加深了PopupWindow的使用,实现点击弹出一个自定义的view,view里面可以自由设计,比较常用的可以放一个listview. demo中我只是一个点击展示,简单的使用了fade in out的动画效果,也没有精美的图片资源,看着也丑,不过这么短的时间,让你掌握一个很好用的技术,可以自己扩展,不很好么? 废话不说了,直接上代码: MainActivity.java public class MainActivi

随机推荐