android dialog 模拟新浪、腾讯title弹框效果

简介:

http://blog.csdn.net/jj120522/article/details/7764183

首先我们看一下新浪微博的效果(其它就是一个dialog):

                            

                         点击title前                                                    点击title后

 实现方式:

     首先我们要自定义一个dialog

    代码如下:

    

[java]  view plain copy
  1. /*** 
  2.  * 自定义dialog 
  3.  *  
  4.  * @author jia 
  5.  *  
  6.  */  
  7. public class MyDialog extends Dialog {  
  8.     private Window window = null;  
  9.   
  10.     /*** 
  11.      *  
  12.      * @param context 
  13.      * @param layoutResID 
  14.      *            配置文件 
  15.      * @param x 
  16.      *            显示的x坐标 
  17.      * @param y 
  18.      *            显示的y坐标 
  19.      * @param title 
  20.      *            集合 
  21.      */  
  22.     public MyDialog(final Context context, int layoutResID, int x, int y,  
  23.             final String[] title) {  
  24.         super(context, R.style.Transparent);  
  25.   
  26.         window = this.getWindow();  
  27.         window.requestFeature(Window.FEATURE_NO_TITLE);  
  28.         setContentView(layoutResID);  
  29.         int width = this.getWindow().getWindowManager().getDefaultDisplay()  
  30.                 .getWidth();  
  31.         windowDeploy(width / 2300, x, y);  
  32.         show();  
  33.   
  34.     }  
  35.   
  36.     /*** 
  37.      * 设置窗口显示 
  38.      *  
  39.      * @param x 
  40.      * @param y 
  41.      * @param dialog_x 
  42.      * @param dialog_y 
  43.      */  
  44.     public void windowDeploy(int dialog_width, int dialog_height, int dialog_x,  
  45.             int dialog_y) {  
  46.   
  47.         window.setBackgroundDrawableResource(android.R.color.transparent); // 设置对话框背景为透明  
  48.         WindowManager.LayoutParams wl = window.getAttributes();  
  49.         wl.width = dialog_width;  
  50.         wl.height = dialog_height;  
  51.         // wl.alpha = 0.8f;  
  52.         wl.gravity = Gravity.LEFT | Gravity.TOP; // 不设置的话默认是居中  
  53.         wl.x = dialog_x - dialog_width / 2// 要显示的位置x坐标  
  54.         wl.y = dialog_y;  
  55.         window.setAttributes(wl);  
  56.         window.setWindowAnimations(R.style.dialogWindowAnim); // 设置窗口弹出动画  
  57.         setCanceledOnTouchOutside(true);  
  58.     }  
  59.   
  60. }  

 我们只需要在activity中调用即可:

 代码片段:

 

[java]  view plain copy
  1. textView.setOnClickListener(new OnClickListener() {  
  2.             @Override  
  3.             public void onClick(View v) {  
  4.   
  5.                 int x_begin = textView.getLeft();  
  6.                 int x_end = textView.getRight();  
  7.                 int y_begin = textView.getTop();  
  8.                 int y_end = textView.getBottom();// 这个是要显示位置的纵坐标  
  9.                 // 获取最中间的x坐标  
  10.                 int x = (x_begin + x_end) / 2;// 这个值也就是屏幕最中间的值,也可以下面这样  
  11.                 // int x=getWindowManager().getDefaultDisplay().getWidth()/2;  
  12.   
  13.                 // int[] location = new int[2];  
  14.                 // textView.getLocationInWindow(location); // 获取在当前窗口内的绝对坐标  
  15.                 // textView.getLocationOnScreen(location);// 获取在整个屏幕内的绝对坐标  
  16.   
  17.                 myDialog = new MyDialog(DialogDemoActivity.this,  
  18.                         R.layout.dialog, x, y_end, title);  
  19.   
  20.                 View view = LayoutInflater.from(DialogDemoActivity.this)  
  21.                         .inflate(R.layout.dialog, null);  
  22.                 listView = (ListView) myDialog.getWindow().findViewById(  
  23.                         R.id.lv_dialog);  
  24.                 listView.setAdapter(new ArrayAdapter<String>(  
  25.                         DialogDemoActivity.this, R.layout.text, R.id.tv_text,  
  26.                         title));  
  27.   
  28.                 listView.setOnItemClickListener(new OnItemClickListener() {  
  29.   
  30.                     @Override  
  31.                     public void onItemClick(AdapterView<?> arg0, View arg1,  
  32.                             int arg2, long arg3) {  
  33.                         textView.setText(title[arg2]);  
  34.                         myDialog.cancel();  
  35.                         myDialog = null;  
  36.                     }  
  37.   
  38.                 });  
  39.             }  
  40.         });  
实现效果如下:

            

           点击前                                                点击后                                             选择                                                   选择后


实现起来也不难,有点要说明一下,这里我们用到了.9.png图片,这个图片会自动根据需要伸展,(重要的是不失真,这点很棒吧,详细介绍请点击连接).

 源码下载


相关文章
|
4月前
|
XML API Android开发
Android 自定义View 之 Dialog弹窗
Android 自定义View 之 Dialog弹窗
|
5月前
|
Android开发
android简单弹框
android简单弹框
22 0
|
10月前
|
Android开发
Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解
Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解
|
Android开发
“千变万化”——神奇的Android图片规格调整器(dialog技术解析篇)
上篇说道,构思这个app时发现了很多平时未注意的问题,其中以Dialog弹窗为第一拦路虎,一方面是自己的技术不够成熟,一方面是自己平时未多多深入阅读。
|
Android开发
android activity方式的dialog
android activity方式的dialog
148 0
android activity方式的dialog
|
Java Android开发 Kotlin
Android 自定义加载动画Dialog弹窗
Android 自定义加载动画Dialog弹窗
288 0
Android 自定义加载动画Dialog弹窗
|
XML Android开发 数据格式
Android自定义Dialog以控制其位置和宽高
Android自定义Dialog以控制其位置和宽高
406 0
|
JSON 缓存 Android开发
Android友盟三方登录、微信新浪分享成功不走回调
微信新浪分享成功不走回调 检查微信回调WXEntryActivity是否是在包名路径下, 例如 包名是com.a.b(微信友盟开放平台),那么你这个activity应该放在com.a.b.wxapi文件夹下 包名为com.a.b ,这个activity放在com.a.b.view.wxapi文件夹下 导致微信回调失败(新浪同理)
297 0
DHL
|
设计模式 算法 安全
0xA05 Android 10 源码分析:Dialog加载绘制流程以及在Kotlin、DataBinding中的使用
0xA05 Android 10 源码分析:Dialog加载绘制流程以及在Kotlin、DataBinding中的使用
DHL
352 0
0xA05 Android 10 源码分析:Dialog加载绘制流程以及在Kotlin、DataBinding中的使用
|
Android开发
android 仿Dialog效果的Activity实现
android 仿Dialog效果的Activity实现
android 仿Dialog效果的Activity实现