• 自定义Dialog


      先说下,一开始学习android使用的是AlertDialog,对付最简单的要求还算可以,后来要适用各种对话框,还要死乞白赖使用AlertDialog,那是找死。

      贴一个几乎万能的简单dialog,首先定义对话框的style:

    <style name="dialog" parent="@android:style/Theme.Dialog">
       <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:background">@android:color/transparent</item><!--背景透明-->
       <item name="android:windowBackground">@android:color/transparent</item>
       <item name="android:backgroundDimEnabled">true</item><!--蒙板-->
       <item name="android:backgroundDimAmount">0.6</item><!--蒙板模糊程度-->
       <item name="android:windowAnimationStyle">@style/Dialog_Anim</item>
    </style>
    
    <style name="Dialog_Anim"> 
       <item name="android:windowEnterAnimation">@anim/fading_in</item> 
       <item name="android:windowExitAnimation">@anim/fading_out</item> 
    </style>

      首先,android:windowAnimationStyle是给dialog的window添加动画效果的,上面的动画从名字就可以看出是个淡入淡出效果,那么我贴出几种常用的效果吧:

      1.淡入淡出:

      fading_in.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <set  
      xmlns:android="http://schemas.android.com/apk/res/android">  
        <alpha android:duration="500" android:fromAlpha="0.1" android:toAlpha="1.0" />
    </set> 

      fading_out.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <set  
      xmlns:android="http://schemas.android.com/apk/res/android">  
        <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.1" />  
    </set>  

      2.擦除

      

      可惜有很多属性不知道,比如上面的window开头的属性eclipse不会自动提示,怎么破?多多积累吧。sytle是个好东西,知道的属性多了以后简直无所不能,贴一个不错的例子网址拓展思维:http://www.cnblogs.com/jiezzy/archive/2012/09/06/2673229.html

      java代码中,new对话框的时候使用构造器Dialog(Context context, int theme),并且使用setContentView()方法把要使用的布局加载进去就OK了:

      dialog = new Dialog(context,R.style.dialog);
      dialog.setContentView(R.layout.XXX);
      dialog.setCancelable(true);
      dialog.show();

      setContentView()的参数可以是View也可以是layout资源文件。如果这个布局中需要取得组件id,直接dialog.findViewById就行了。

      接下来贴出一个网上的demo,里面提供了设置dialog位置、大小、透明度的方法:

    import android.app.Activity;
    import android.app.Dialog;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.Window;
    import android.view.WindowManager;
    
    public class DialogDemoActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Dialog dialog = new Dialog(this);
            
            // setContentView可以设置为一个View也可以简单地指定资源ID
            // LayoutInflater
            // li=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            // View v=li.inflate(R.layout.dialog_layout, null);
            // dialog.setContentView(v);
            dialog.setContentView(R.layout.dialog_layout);
    
            dialog.setTitle("Custom Dialog");
    
            /* 
             * 获取对话框的窗口对象及参数对象以修改对话框的布局设置,
             * 可以直接调用getWindow(),表示获得这个Activity的Window
             * 对象,这样这可以以同样的方式改变这个Activity的属性.
             */
            Window dialogWindow = dialog.getWindow();
            WindowManager.LayoutParams lp = dialogWindow.getAttributes();
            dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);
    
            /*
             * lp.x与lp.y表示相对于原始位置的偏移.
             * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
             * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
             * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
             * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
             * 当参数值包含Gravity.CENTER_HORIZONTAL时
             * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
             * 当参数值包含Gravity.CENTER_VERTICAL时
             * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
             * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
             * Gravity.CENTER_VERTICAL.
             * 
             * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
             * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
             * Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
             */
            lp.x = 100; // 新位置X坐标
            lp.y = 100; // 新位置Y坐标
            lp.width = 300; // 宽度
            lp.height = 300; // 高度
            lp.alpha = 0.7f; // 透明度
    
            // 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes
            // dialog.onWindowAttributesChanged(lp);
            dialogWindow.setAttributes(lp);
    
            /*
             * 将对话框的大小按屏幕大小的百分比设置
             */
    //        WindowManager m = getWindowManager();
    //        Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
    //        WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
    //        p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6
    //        p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.65
    //        dialogWindow.setAttributes(p);
    
            dialog.show();
    
        }
    }
  • 相关阅读:
    loj#2049. 「HNOI2016」网络(set 树剖 暴力)
    创建多个Oracle数据库及相应的实例
    [置顶] lua 进阶3--lua文件中调用C++函数
    android 设置Button或者ImageButton的背景透明 半透明 透明
    struts2 18拦截器详解(七)
    《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
    ios7下不能录音问题解决
    360 2013校园招聘笔试题(含参考答案)
    【MFC三天一个游戏】之 局域网黑白棋
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/Couch-potato/p/3737621.html
Copyright © 2020-2023  润新知