zoukankan      html  css  js  c++  java
  • Android初级教程以动画的形式弹出窗体

    这一篇集合动画知识和弹出窗体知识,综合起来以动画的形式弹出窗体。

    动画的知识前几篇已经做过详细的介绍,可翻阅前面写的有关动画博文。先简单介绍一下弹出窗体效果的方法:

    首先,需要窗体的实例:PopupWindow window = new PopupWindow(contentView, width, height);

    总共需要三个参数,三个参数的含义分别是:

              /  **contentView:窗体属于一个“容器”因此填充一个布局,因此要专门为之建一个布局,它就是填充布局后的view,(类似于自定义对话框)。窗体显示的内容
             * 布局的宽   -2表示wrap_content
             * height:布局的高
             */

    因此要为第一个参数放置一个代表布局的view对象

    contentView = View.inflate(getApplicationContext(), R.layout.popup, null);

    最后显示窗体:

     //三个参数含义:父组件(点击button,button就是父组件);相对于窗体左上角对其;相对于窗体左上角实际宽高

    window.showAtLocation(v, Gravity.LEFT | Gravity.TOP, 50, 50);

    好了,窗体基本的api介绍完了,来看一下展示窗体的代码:

    package com.itydl.showwindow;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Gravity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.PopupWindow;
    
    public class MainActivity extends Activity {
    
        private View contentView;//窗体显示内容,代表要放置的一个布局
    	private PopupWindow window;//获取窗体对象
    
    	@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            initPopup();//初始化组件
        }
    
    	/**
    	 * 初始化弹出窗体
    	 */
        private void initPopup() {
        	//获取布局view
        	contentView = View.inflate(getApplicationContext(), R.layout.popup, null);
        	
        	/**contentView:窗体属于一个“容器”因此填充一个布局,因此要专门为之建一个布局,它就是填充布局后的view,(类似于自定义对话框)。窗体显示的内容
    		 * 布局的宽   -2表示wrap_content
    		 * height:布局的高
    		 */
    		window = new PopupWindow(contentView, -2, -2);//获取窗体对象
    	}
    
    
    	/**
         * 点击按钮弹出窗体
         * @param v
         */
        public void popupWindow(View v){
        	//显示窗体
            //三个参数含义:父组件(点击button,button就是父组件);相对于窗体左上角对其;相对于窗体左上角实际宽高
          window.showAtLocation(v, Gravity.LEFT | Gravity.TOP, 50, 50);
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
    }
    
    运行程序如下所示:

    按下返回键,你会发现程序崩溃了。这是因为弹出窗体返回的时候必须释放掉窗体的所有资源,因此放到与activity绑定起来,放到ondestry()中就行了:

    @Override
        protected void onDestroy() {
        	if(window!=null && window.isShowing()){
        		//跟着返回互动的关闭一起关闭
        		window.dismiss();
        		window=null;
        	}
        	super.onDestroy();
        }

    以上把弹窗窗体基本方法介绍的差不多没接下来就更改一些参数,且把动画一起加进去,实现出题以动画的效果弹出:

    直接上完整代码:

    package com.itydl.showwindow;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.view.Gravity;
    import android.view.Menu;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.ScaleAnimation;
    import android.widget.PopupWindow;
    
    public class MainActivity extends Activity {
    
        private View contentView;//窗体显示内容,代表要放置的一个布局
    	private PopupWindow window;//获取窗体对象
    	private ScaleAnimation sa;//添加动画
    
    	@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            initPopup();//初始化组件
        }
    
    	/**
    	 * 初始化弹出窗体
    	 */
        private void initPopup() {
        	//获取布局view
        	contentView = View.inflate(getApplicationContext(), R.layout.popup, null);
        	 
        	        /**contentView:窗体属于一个“容器”因此填充一个布局,因此要专门为之建一个布局,它就是填充布局后的view,(类似于自定义对话框)。窗体显示的内容
    		 * 布局的宽   -2表示wrap_content
    		 * height:布局的高
    		 */
    		window = new PopupWindow(contentView, -2, -2);//获取窗体对象
    		
    		////添加动画
    		sa = new ScaleAnimation(1, 1, 0, 1, Animation.RELATIVE_TO_SELF,0.5f ,Animation.RELATIVE_TO_SELF,0f);
    		sa.setDuration(3000);//设置播放时长3s
    	}
    
    
    	/**
         * 点击按钮弹出窗体
         * @param v
         */
        public void popupWindow(View v){
        	if(window!=null && window.isShowing()){//判断语句,实现点击按钮出现窗体,再点击消失
        		window.dismiss();
        		
        	}else{
        		
        		int[] location = new int[2];//location[0]代表x轴;location[1]代表y轴
        		//获取当前view组件在屏幕中的坐标(这里v是button);把坐标封装到了参数数组里面
    			v.getLocationInWindow(location);//C++的编程风格
    			//要想给窗体设置动画效果,必须为窗体设置一个背景,如果没有背景动画不会显示。
    			 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//设置窗体弹出的背景。定义一个透明的背景(基本都是如此)
    			 contentView.setAnimation(sa);//动画效果给与哪个组件上
    			 /**窗体的
    			  * 1、相对父组件
    			  * 2、对齐方式
    			  * 3、x坐标
    			  * 4、y坐标
    			  */
          		  //显示窗体      设置窗体显示位置在按钮的右下角。获取当前view组件的坐标,加上其宽高作为新的坐标
        		  window.showAtLocation(v, Gravity.LEFT | Gravity.TOP, location[0]+v.getWidth(), location[1]+v.getHeight());
        	}
        }
        
        @Override
        protected void onDestroy() {
        	if(window!=null && window.isShowing()){
        		 //跟着返回互动的关闭一起关闭
         		window.dismiss();
         		window=null;
        	}
        	super.onDestroy();
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
    }
    

    这样就实现了窗体动画形式展示了。给出一张正在播放动画的截图如下:



  • 相关阅读:
    Java注解入门
    两种求素数
    几个经典的递归小程序
    Java8新特性——接口的默认方法和类方法
    SSH框架总结
    初识SSH框架
    Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的
    使用SQL查询所有数据库名和表名
    mybatis中#{}和${}的区别
    SOCKET, TCP/UDP, HTTP, FTP 浅析
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299643.html
Copyright © 2011-2022 走看看