2017-03-14 23:27:58 qq_16628781 阅读数 890
  • Android 项目实战-影讯

    本课程包含14个小节课程,内容包括:影讯项目演示,影讯项目架构,使用聚合API后台,封装Volley网络框架,根据JSON格式创建JavaBean,实现底部导航 ,实现侧滑菜单,实现MovieDao,实现可索引ListView,集成百度地图实现定位,实现首页电影列表,实现电影详情,实现影院列表,实现影院详细。

    6644 人正在学习 去看看 郭宏志

文章链接:

Android之底部弹窗

知识点:

1、dialog的简单使用;

2、自定义底部弹框;

3、新名词记录

{

5.0 转场动画

}

底部弹框:就是从手机屏幕底边位置弹出来,最常见的就是弹框里头有好几个选项让你选择。例如微信里面看一篇文章的时候,我们点击右上角的按钮,就会看到有一个弹框从底部弹出来,里面有各个选项可以点击选择。那么怎么来做呢?

思路其实很简单,一说到弹框,我们脑海里必然先想到的是dialog。这个东西可是很好用的呢,很多弹窗的提示,我们都是直接使用它的了。

这里有一个弹窗dialog的使用示例:

private void dialog(){  
        AlertDialog.Builder builder=new AlertDialog.Builder(this); 
        builder.setTitle("提示"); //设置标题  
        builder.setMessage("是否确认退出?"); //设置内容  
        builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id  
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { //设置确定按钮  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss(); //关闭dialog  
                Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();  
            }  
        });  
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置取消按钮  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();  
                Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();  
            }  
        });  
        //创建并显示出来  
        builder.create().show();  
    }  
效果图我就不展示出来了。大家可以将上面的代码在工程里头跑一跑就知道了。

那么如何来做我们底部的弹框呢,我们知道dialog是依附在window上面的,而window里头有一个setGravity(int)的方法,我们继承dialog,自定义一个控件,然后拿到dialog依附的这个Window,然后设置dialog显示的位置,并且把先要显示的内容以一个view传过去,我们直接显示出来就OK了。

下面我直接把我们继承自dialog的BottomDialog.java类直接贴出来。代码很简单,一看就明白了。我就不做过多的解释了。

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;


/**
 * desc:自定义冲底部弹出来的弹框
 * <p>
 * author:kuyu.yaojt (tanksu)
 * <p>
 * email:yaojt@kuyumall.com
 * <p>
 * date:17/3/14
 */

public class BottomDialog extends Dialog {

    /*
     这两个文件都是在style.xml文件里头定义
        DialogTheme 样式:
     <style name="DialogTheme" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <!-- 边框 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 半透明 -->
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 模糊 -->
    </style>

    DialogBottomAnim 动画数据,利用的是系统的动画
    <style name="DialogBottomAnim">
        <!--进入动画-->
        <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
        <!--退出动画-->
        <item name="@android:windowExitAnimation">@anim/dialog_exit</item>
    </style>
    */

    /**
     * 构造函数
     *
     * @param context context
     * @param view    显示的view
     * @param cancel  点击外部是否可以取消
     */
    public BottomDialog(Context context, View view, boolean cancel) {
        this(context, view, R.style.DialogTheme, cancel);
    }

    /**
     * @param context           context
     * @param view              显示的view
     * @param style             布局样式
     * @param outsideCancelAble 点击外部是否可以取消
     */
    public BottomDialog(Context context, View view, int style, boolean outsideCancelAble) {
        super(context, style);
        setContentView(view);

        setCanceledOnTouchOutside(outsideCancelAble);

        Window window = getWindow();
        if (window != null) {
            /* 此处可以设置dialog显示的位置 */
            window.setGravity(Gravity.BOTTOM);

            /* 添加动画 */
            window.setWindowAnimations(R.style.DialogBottomAnim);

            ViewGroup.LayoutParams params = view.getLayoutParams();
            if (params == null) {
                params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            }
            /* 重新设置弹框的宽度 */
            params.width = window.getWindowManager().getDefaultDisplay().getWidth();

            view.setLayoutParams(params);
        }
    }

}

我把需要用到的资源文件,都直接放在上面这个类里头,你只需要将他们放到style.xml文件里头就可以了。

然后是怎么调用上面这个自定义的底部弹框类。很简单,如下:

View view = LayoutInflater.from(this).inflate(R.layout.popup_trans_dialog, null);
            mBottomDialog = new BottomDialog(this, view, true);
            createView(view);
createView(View)方法是对于显示的view里头操作的响应,BottomDialog只是紧紧帮你展示你的view,事件的监听响应都是外面去做的,例如有一个button,我们可以findviewbyid(),然后设置点击监听等等操作。
这就是今天的内容,如果任何问题,请及时与我联系,谢谢!
2018-08-19 13:15:49 qq_14876133 阅读数 759
  • Android 项目实战-影讯

    本课程包含14个小节课程,内容包括:影讯项目演示,影讯项目架构,使用聚合API后台,封装Volley网络框架,根据JSON格式创建JavaBean,实现底部导航 ,实现侧滑菜单,实现MovieDao,实现可索引ListView,集成百度地图实现定位,实现首页电影列表,实现电影详情,实现影院列表,实现影院详细。

    6644 人正在学习 去看看 郭宏志
使用PopupWindow仿一个IOS底部弹窗

先定义一个PopupWindow

package com.aiguanggao.qqbottompop;

import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private PopupWindow mPop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void showBottomPop(View view) {
        showPop(view);
    }

    //初始化弹窗
    private void initPop() {
        if (mPop == null) {
            View view = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
            mPop = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            //点击弹窗外消失mPop
            mPop.setFocusable(true);
            mPop.setOutsideTouchable(true);
            //设置背景,才能使用动画效果
            mPop.setBackgroundDrawable(new BitmapDrawable());
            //设置动画
            mPop.setAnimationStyle(R.style.PopWindowAnim);
            //设置弹窗消失监听
            mPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.alpha = 1f;
                    getWindow().setAttributes(lp);
                }
            });
            //设置弹窗内的点击事件
            setPopClickListener(view);
        }
    }

    //显示弹窗
    private void showPop(View v) {
        initPop();
        if (mPop.isShowing())
            return;
        //设置弹窗底部位置
        mPop.showAtLocation(v, Gravity.BOTTOM, 0, 0);
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.alpha = 0.6f;
        getWindow().setAttributes(lp);
    }

    private void setPopClickListener(View view) {
        TextView video, photo, cancle;
        video = view.findViewById(R.id.video);
        photo = view.findViewById(R.id.photo);
        cancle = view.findViewById(R.id.cancle);
        video.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "视频", Toast.LENGTH_SHORT).show();
            }
        });
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "相册", Toast.LENGTH_SHORT).show();
            }
        });
        cancle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                mPop.dismiss();
            }
        });
    }
}

再定义PopupWindow动画效果

弹窗进入动画

in_anim.xml

<?xml version="1.0" encoding="utf-8"?><!--进入动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="100%"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toXDelta="0" />

弹窗退出动画

out_anim.xml

<?xml version="1.0" encoding="utf-8"?><!--进入动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="0%"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toYDelta="100%" />

在style文件里定义动画效果

styles.xml

 <!--弹窗动画-->
<style name="PopWindowAnim">
    <item name="android:windowEnterAnimation">@anim/in_anim</item>
    <item name="android:windowExitAnimation">@anim/out_anim</item>
</style>

定义一个圆角图片

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="5dp" />
    <solid android:color="#ddffffff" />
</shape>

代码下载

2017-03-02 15:42:42 ayrascal 阅读数 772
  • Android 项目实战-影讯

    本课程包含14个小节课程,内容包括:影讯项目演示,影讯项目架构,使用聚合API后台,封装Volley网络框架,根据JSON格式创建JavaBean,实现底部导航 ,实现侧滑菜单,实现MovieDao,实现可索引ListView,集成百度地图实现定位,实现首页电影列表,实现电影详情,实现影院列表,实现影院详细。

    6644 人正在学习 去看看 郭宏志

准备:

public class ActionSheet {
   public interface OnActionSheetSelected {
      void onClick(int whichButton);
   }

   private ActionSheet() {
   }

   public static Dialog showSheet(final Context context, final int layoutId,
         final OnActionSheetSelected actionSheetSelected,
         final OnCancelListener cancelListener) {
      final Dialog dialog = new Dialog(context, R.style.ActionSheet);
      final LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      final LinearLayout layout = (LinearLayout) inflater.inflate(layoutId,
            null);
      final int cFullFillWidth = 10000;
      layout.setMinimumWidth(cFullFillWidth);

      final Window w = dialog.getWindow();
      final WindowManager.LayoutParams lp = w.getAttributes();
      lp.x = 0;
      final int cMakeBottom = -1000;
      lp.y = cMakeBottom;
      lp.gravity = Gravity.BOTTOM;
      dialog.onWindowAttributesChanged(lp);
      dialog.setCanceledOnTouchOutside(true);
      if (cancelListener != null) {
         dialog.setOnCancelListener(cancelListener);
      }

      dialog.setContentView(layout);
      dialog.show();

      return dialog;
   }
}
<style name="ActionSheet" parent="@android:style/Theme.Dialog">

应用:

private ActionSheet.OnActionSheetSelected mOnActionSheetSelected;
private Dialog mActionSheet;
调用showGetPhotoDialog()方法

public void onActionSheetClicked(final View view) {
   mOnActionSheetSelected.onClick(view.getId());
}

public void setOnSheetClicked(final ActionSheet.OnActionSheetSelected onActionSheetSelected) {
   mOnActionSheetSelected = onActionSheetSelected;
}

private void showGetPhotoDialog() {
   mActionSheet = ActionSheet.showSheet(this, R.layout.actionsheet_dialog, getOnActionSheetClicked(), null);
}

private ActionSheet.OnActionSheetSelected getOnActionSheetClicked() {

   return new ActionSheet.OnActionSheetSelected() {

      @Override
      public void onClick(final int whichButton) {
         switch (whichButton) {
            case R.id.tv_button1:
               
               break;
 	    case R.id.tv_button2:
               
               break;
case R.id.tv_calendar: mActionSheet.dismiss(); break; default: break; } mActionSheet.dismiss(); } };}
布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/clear"
    android:orientation="vertical"
    android:padding="5dp" >

    <TextView
        android:id="@+id/tv_botton1"
android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/actionsheet_top_selector" android:clickable="true" android:gravity="center" android:onClick="onActionSheetClicked" android:text="Button1" android:textSize="18sp" /> <TextView android:id="@+id/tv_botton2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/actionsheet_bottom_selector" android:clickable="true" android:gravity="center" android:onClick="onActionSheetClicked" android:text="Button2" android:textColor="@color/green_title_bar" android:textSize="18sp" /> <TextView android:id="@+id/cancel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="@drawable/actionsheet_single_selector" android:clickable="true" android:gravity="center" android:onClick="onActionSheetClicked" android:text="@string/cancle" android:textColor="@color/cancle_blue" android:textSize="18sp" /></LinearLayout>




2018-08-19 14:59:30 qq_34915398 阅读数 400
  • Android 项目实战-影讯

    本课程包含14个小节课程,内容包括:影讯项目演示,影讯项目架构,使用聚合API后台,封装Volley网络框架,根据JSON格式创建JavaBean,实现底部导航 ,实现侧滑菜单,实现MovieDao,实现可索引ListView,集成百度地图实现定位,实现首页电影列表,实现电影详情,实现影院列表,实现影院详细。

    6644 人正在学习 去看看 郭宏志

参考:https://blog.csdn.net/a525942/article/details/56834639

 效果:

                                                                          

1. 创建类 PayWayDialog 继承自 Dialog

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_dialog);
        Window dialogWindow = getWindow();  //得到弹框
        dialogWindow.setGravity(Gravity.BOTTOM); //设为在底部
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width = AbsListView.LayoutParams.MATCH_PARENT;  //宽度设置
        lp.y = 0;  //离底部距离为0
        dialogWindow.setAttributes(lp);
    }

2. 自定义 dialog 布局

 

3. 调用

PayWayDialog payWayDialog = new PayWayDialog(OrderActivity.this);
            payWayDialog.show();

点击事件在类 PayWayDialog 中设置

 

2012-09-25 22:16:35 xiao12593a 阅读数 550
  • Android 项目实战-影讯

    本课程包含14个小节课程,内容包括:影讯项目演示,影讯项目架构,使用聚合API后台,封装Volley网络框架,根据JSON格式创建JavaBean,实现底部导航 ,实现侧滑菜单,实现MovieDao,实现可索引ListView,集成百度地图实现定位,实现首页电影列表,实现电影详情,实现影院列表,实现影院详细。

    6644 人正在学习 去看看 郭宏志

本例使用activity实现弹出滑动窗口或菜单,主要是使用了一些设置activity的样式来实现弹出窗口和滑动效果,实现如下:

第一步:设计要弹出窗口的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:gravity="center_horizontal"
    android:orientation="vertical"
    android:layout_alignParentBottom="true"
     android:background="@drawable/btn_style_alert_dialog_background"
     >

    
    <Button
        android:id="@+id/btn_take_photo"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:layout_marginTop="20dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="拍照"
        android:background="@drawable/btn_style_alert_dialog_button"
        android:textStyle="bold"
         />

    <Button
        android:id="@+id/btn_pick_photo"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:layout_marginTop="5dip" 
         android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="从相册选择"
         android:background="@drawable/btn_style_alert_dialog_button"
         android:textStyle="bold"
         />

    <Button
        android:id="@+id/btn_cancel"
       android:layout_marginLeft="20dip"
       android:layout_marginRight="20dip"
       android:layout_marginTop="15dip" 
	   android:layout_marginBottom="15dip"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="取消"
       android:background="@drawable/btn_style_alert_dialog_cancel"
       android:textColor="#ffffff"
       android:textStyle="bold"
       
        />
</LinearLayout>
</RelativeLayout>

 第二步:创建SelectPicPopupWindow类继承Activity类并实现OnClickListener接口(可以不用在这里实现这个借口,根据自己需要和方便实现),其他代码实现跟编写常规Activity一样就OK,如下:

mport android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class SelectPicPopupWindow extends Activity implements OnClickListener{

	private Button btn_take_photo, btn_pick_photo, btn_cancel;
	private LinearLayout layout;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.alert_dialog);
		btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
		btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
		btn_cancel = (Button) this.findViewById(R.id.btn_cancel);
		
		layout=(LinearLayout)findViewById(R.id.pop_layout);
		
		//添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
		layout.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!", 
						Toast.LENGTH_SHORT).show();	
			}
		});
		//添加按钮监听
		btn_cancel.setOnClickListener(this);
		btn_pick_photo.setOnClickListener(this);
		btn_take_photo.setOnClickListener(this);
	}
	
	//实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
	@Override
	public boolean onTouchEvent(MotionEvent event){
		finish();
		return true;
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_take_photo:
			break;
		case R.id.btn_pick_photo:				
			break;
		case R.id.btn_cancel:				
			break;
		default:
			break;
		}
		finish();
	}
	
}

 

 第三步:编写MainActivity类,这里很简单就是点击启动刚才要实现窗口的MainActivity即可:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity {
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) this.findViewById(R.id.text);
        //把文字控件添加监听,点击弹出自定义窗口
        tv.setOnClickListener(new OnClickListener() {			
			public void onClick(View v) {
				startActivity(new Intent(MainActivity.this,SelectPicPopupWindow.class));
			}
		});
    }
    
}
 

第四步:这里要注意下AndroidManifest.xml对SelectPicPopupWindow的配置跟常规的不一样为该activity改添加android:theme属性,如下:

<activity android:name=".SelectPicPopupWindow" android:theme="@style/MyDialogStyleBottom" /> 

 第五步:这一步是实现本实例最重要的一部就是设置android:theme属性样式以实现本例所需要的效果,如下:

 

    <style name="AnimBottom" parent="@android:style/Animation">
        <item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
        <item name="android:windowExitAnimation">@anim/push_bottom_out</item>
    </style>

    <style name="MyDialogStyleBottom" parent="android:Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/AnimBottom</item>
        <item name="android:windowFrame">@null</item>
 <!-- 边框 -->
        <item name="android:windowIsFloating">true</item>
 <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">true</item>
 <!-- 半透明 -->
        <item name="android:windowNoTitle">true</item>
 <!-- 无标题 -->
        <item name="android:windowBackground">@android:color/transparent</item>
 <!-- 背景透明 -->
        <item name="android:backgroundDimEnabled">true</item>
 <!-- 模糊 -->
    </style>

 第六步:在贴出弹出和销毁时的动画效果代码:

 

push_bottom_in.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"        
     />      
</set>

 push_buttom_out.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" />
</set>

 注意:这两个xml需要放在res/anim的anim文件夹下

 

第七步;运行效果如图:


 

 

没有更多推荐了,返回首页