自定义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();

    }
}

 

posted @ 2014-05-22 11:15  沙发土豆  阅读(335)  评论(0编辑  收藏  举报