精华内容
下载资源
问答
  • Ian今天偶然进入一个公司的企业网站,然后QQ聊天...ian在这里把实现“网页自动弹出QQ对话框”的原理与方法分享给各位做企业网站的朋友,这些小手段能够实现跟《在认证QQ空间主页上同步显示网站内容》一样对于网站...

    Ian今天偶然进入一个公司的企业网站,然后QQ聊天窗口这里马上就弹出与那个公司客服聊天的窗口。怀着好奇的心态,Ian分析了该公司的网站源码,发现了实现网页弹出qq对话框的原理与实现方法,相信此时此刻你的QQ已经打开了与Ian聊天的窗口了吧!

    ian在这里把实现“网页自动弹出QQ对话框”的原理与方法分享给各位做企业网站的朋友,这些小手段能够实现跟《在认证QQ空间主页上同步显示网站内容》一样对于网站的推广具有比较有用的效果。

    通过自动弹出QQ对话框的方法能够实现很高的客户询盘量,相比“左一个、右一个、中间再弹一个”的客服组件,通过“打开网页自动弹出QQ对话框”这种方式来实现提升咨询量无论是用户体验还是效果都要强很多。

    好啦,废话不多说了,下面进入正题,且看如何让访客访问您网站时自动弹出QQ聊天的对话框。

    一、网页自动弹出QQ对话框的原理

    1.在网页中插入iframe框架并设置src=“tencent://message/?uin=你的QQ号码&Site=&menu=yes”;

    2.访客打开你网站的同时也会打开iframe框架中的链接;

    3.访客的QQ窗口就会弹出与你的QQ聊天的对话框了。

    二、验证打开网页自动弹出QQ对话框

    为验证该方法的实际可行性,相信你的QQ聊天窗口已经打开了与Ian对话的聊天窗口。是不是很好奇呢?如果说上面的原理分析你看不懂,那么这里的验证结果应该就能让你很直观地理解了吧!其实Ian同样是利用这个原理在这篇文章中加入了这段实现“打开网页自动弹出QQ对话框”的代码。

    打开网页自动弹出QQ对话框的代码在这里:【右击这里查看源码也可以点击这里给我捐款

    三、设置多个QQ客服,然后随机弹出一个客服QQ对话框

    针对企业中有多个客服的情况,为了客服直接合理分配接待。Ian刚刚也研究出了一套解决方案就是预设多个客服QQ,然后给访客随机弹出一个客服QQ的对话框!当然这个适合于企业,对于个人站长就没必要了。

    四、延迟弹出对话框,让用户先看看
    有不少客户问我如何设置访客打开页面后10秒再弹出,Ian再次研究更新了这个弹出,确实找到的方法可设置10秒后弹出!这样可以一定程度上提升用户体验,同时让访客先看看网站的优质服务能够有效地提升客户对产品的认可度,进而提升客户主动沟通的机会!

    五、手机QQ也可以哦,移动用户也不容错过

    刚刚有位朋友问我这个能不能在手机网页上用,然后Ian测试了一下这个方法确实不行。随后我便研究了好一会,终于找到手机网页弹出手机QQ的突破点了,经测试安卓、苹果手机都可以正常弹出QQ对话框。

    六、获取访客QQ,让客服主动把握客户

    通过上面的方法,有朋友说客户打开对话框后并不马上咨询就出去吃饭了,回来就忘了。对此,Ian还就此文章扩展想到了访客访问网站自动获取QQ号的方法,通过这个方法能够避免访客的流失,就算访客没咨询没成交也没关系,你知道了客户的QQ号码,以后就随时可以给对方发送消息了。有需要的朋友可以在聊天窗口里面Q一下ian就行了。

    展开全文
  • Android仿手机QQ空间动态评论,自动定位到输入框

    万次阅读 热门讨论 2016-04-14 18:32:31
    手机QQ空间浏览好友动态时,可以直接对动态评论,点击某条评论,动态列表自动滚动,使输入框刚好在该评论下面,而不会覆盖住评论内容。如下图所示,首先要实现输入框刚好在输入面板上面,且动态列表不会被挤上去。...

    手机QQ空间浏览好友动态时,可以直接对动态评论,点击某条评论,动态列表自动滚动,使输入框刚好在该评论下面,而不会覆盖住评论内容。如下图所示,


    首先要实现输入框刚好在输入面板上面,且动态列表不会被挤上去。可以使用对话框的形式,这样输入框不会影响原有的布局,弹出的对话框布局如下所示,点击EditText时,红色块的内容将位于输入法上面。在这里我把ScrollerView的背景设为透明。其实QQ空间的输入框也是以对话框的形式弹出,因为弹出对话框时,原本全屏的布局突然多了一条状态栏。


    接着就是要让点击的评论刚好在评论输入框上面,可以使用ListView.smoothScrollBy(distance, duration)让列表滚动到相应位置,但是难点是如何计算出滚动的距离distance。

    如下图所示,我们主要计算弹出输入面板后的输入框和评论之间的距离(绿色线条的长度)。通过View.getLocationOnScreen()方法可以计算出view在屏幕上的坐标(x,y),那么列表滑动的距离distance = listview的y坐标 - 输入框的y坐标。


    /**
         * 弹出评论对话框
         */
        public static void inputComment(final Activity activity, final ListView listView,
                                        final View btnComment, final User receiver,
                                        final InputCommentListener listener) {
    
            final ArrayList<Comment> commentList = (ArrayList) btnComment.getTag(KEY_COMMENT_SOURCE_COMMENT_LIST);
    
            String hint;
            if (receiver != null) {
                if (receiver.mId == MainActivity.sUser.mId) {
                    hint = "我也说一句";
                } else {
                    hint = "回复 " + receiver.mName;
                }
            } else {
                hint = "我也说一句";
            }
            // 获取评论的位置,不要在CommentDialogListener.onShow()中获取,onShow在输入法弹出后才调用,
            // 此时btnComment所属的父布局可能已经被ListView回收
            final int[] coord = new int[2];
            if (listView != null) {
                btnComment.getLocationOnScreen(coord);
            }
    
            //弹出评论对话框
            showInputComment(activity, hint, new CommentDialogListener() {
                @Override
                public void onClickPublish(final Dialog dialog, EditText input, final TextView btn) {
                    final String content = input.getText().toString();
                    if (content.trim().equals("")) {
                        Toast.makeText(activity, "评论不能为空", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    btn.setClickable(false);
                    final long receiverId = receiver == null ? -1 : receiver.mId;
                    Comment comment = new Comment(MainActivity.sUser, content, receiver);
                    commentList.add(comment);
                    if (listener != null) {
                        listener.onCommitComment();
                    }
                    dialog.dismiss();
                    Toast.makeText(activity, "评论成功", Toast.LENGTH_SHORT).show();
                }
    
                /**
                 * onShow在输入法弹出后才调用
                 * @param inputViewCoordinatesInScreen  输入框距离屏幕顶部(不包括状态栏)的位置[left,top]
                 */
                @Override
                public void onShow(int[] inputViewCoordinatesInScreen) {
                    if (listView != null) {
                        // 点击某条评论则这条评论刚好在输入框上面,点击评论按钮则输入框刚好挡住按钮
                        int span = btnComment.getId() == R.id.btn_input_comment ? 0 : btnComment.getHeight();
                        listView.smoothScrollBy(coord[1] + span - inputViewCoordinatesInScreen[1], 1000);
                    }
                }
    
                @Override
                public void onDismiss() {
    
                }
            });
    
        }

    最后要弄的就是评论中,评论者、接收者和评论内容用不同的颜色显示,且点击时有点击效果。这里可以通过下面的代码实现,

    TextView.setText(Html.fromHtml(content, imageGettor, tagHandler))

    自定义标签,通过自定义的标签解析类Html.TagHandler来响应不同标签的操作。这里我自定义了commentator、receiver、content标签,列入一条评论的字符串形式为“<commentator>用户1</commentator> 回复 <receiver>用户2</receiver>:<content>评论内容</content>”,点击content标签时对该评论的评论者进行回复。

    /**
     * 显示评论的自定义Html标签解析器
     */
    public class CustomTagHandler implements Html.TagHandler {
        //自定义标签
        public static final String TAG_COMMENTATOR = "commentator"; // 评论者
        public static final String TAG_RECEIVER = "receiver"; // 评论接收者,即对谁评论
        public static final String TAG_CONTENT = "content"; // 评论内容
    
        ...
    
        /**
         * 解析自定义标签
         */
        @Override
        public void handleTag(boolean opening, String tag, final Editable output, XMLReader xmlReader) {
            if (!tag.toLowerCase().equals(TAG_COMMENTATOR) && !tag.toLowerCase().equals(TAG_RECEIVER)
                    && !tag.toLowerCase().equals(TAG_CONTENT)) {
                return;
            }
            if (opening) {  //开始标签
                // 记录标签内容的起始索引
                int mStart = output.length();
                if (tag.toLowerCase().equals(TAG_COMMENTATOR)) {
                    mMaps.put(KEY_COMMENTATOR_START, mStart);
                } else if (tag.toLowerCase().equals(TAG_RECEIVER)) {
                    mMaps.put(KEY_RECEIVER_START, mStart);
                } else if (tag.toLowerCase().equals(TAG_CONTENT)) {
                    mMaps.put(KEY_CONTENT_START, mStart);
                }
            } else { // 结束标签
                int mEnd = output.length(); //标签内容的结束索引
    
                if (tag.toLowerCase().equals(TAG_COMMENTATOR)) {
                    int mStart = mMaps.get(KEY_COMMENTATOR_START);
                    output.setSpan(new TextAppearanceSpan(mContext, R.style.Comment),
                            mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    output.setSpan(mCommentatorSpan, mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
                } else if (tag.toLowerCase().equals(TAG_RECEIVER)) {
                    int mStart = mMaps.get(KEY_RECEIVER_START);
                    output.setSpan(new TextAppearanceSpan(mContext, R.style.Comment),
                            mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    output.setSpan(mReceiverSpan, mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
                } else if (tag.toLowerCase().equals(TAG_CONTENT)) {
                    int mStart = mMaps.get(KEY_CONTENT_START);
                    output.setSpan(new TextAppearanceSpan(mContext, R.style.Comment),
                            mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    output.setSpan(mContentSpan, mStart, mEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
    
       ...
    }
    

    在ListView中,因为Item里面的子View使用了ClickableSpan,导致ListView的OnItemClickListener失效,解决的方法可以在getView中加入下列代码,阻止ListView里面的子View拦截焦点。

    public View getView(int position, View convertView, ViewGroup parent) {
    	if (convertView != null) {
    		    //防止ListView的OnItemClick与item里面子view的点击发生冲突
    	((ViewGroup) convertView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    	}
    }

    设置点击的文字背景色:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
              ...
              android:textColorLink="@color/selector_comment_name"
              android:textColorHighlight="#44000000"
            />
    <!-- 上面两个属性(textColorLink、textColorHighlight)要同时设置,而且textColorLink必须设置为ColorList!!!!!!!!!
    -->

    难点都已经解决了,最后实现的效果如下:



    完整demo:https://github.com/1993hzw/QZoneComment


    由于本人的毕业论文的题目为基于android的QQ空间模拟系统,所以对android版的QQ空间研究了不少,山寨了其核心功能。之后有机会继续跟大家分享经验,谢谢支持。


    展开全文
  • 'QQ空间', '微博', 'FaceBook', '邮件', '链接' ]; // 这个urlItems这里没有用到 List<String> urlItems = [ 'static/images/mx_wx.png', 'static/images/store.png', 'static/images/mx_qq.png', '...

    Flutter是Google(全球顶级互联网科技公司)的生的,后台够硬,毫无疑问Flutter即将或已经成为跨平台开发的主流,Flutter野心很大,不仅冲击着原生开发,而且很有可能会烧到Web前端。作为移动端开发者的你,如果不关注Flutter的话,实在说不过去啦!

    本文使用Flutter实现的各种类型的对话框Dialog…

    一、效果图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、源码

    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'dart:io';
    import 'package:flutter/services.dart';//导入网络请求相关的包
    import 'package:fluttertoast/fluttertoast.dart';
    import 'package:ydcflutter_app/widget/dialog/YDCBottomSheet.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:ydcflutter_app/widget/dialog/YDCLoadingDialog.dart';
    import 'package:ydcflutter_app/utils/YDCCommonUtils.dart';
    import 'package:ydcflutter_app/widget/dialog/YDCMessageDialog.dart';
    import 'package:ydcflutter_app/widget/dialog/YDCCustomSureDialog.dart';
    import 'package:flutter_screenutil/flutter_screenutil.dart';
    import 'package:ydcflutter_app/widget/dialog/YDCCustomDialog.dart';
    
    class DialogPage extends StatefulWidget {
      @override
      State createState() => new _DialogPageState();
    }
    
    class _DialogPageState extends State<DialogPage> {
    
      BuildContext mContext;
      final TextEditingController _phoneController = new TextEditingController();
      final TextEditingController _passwordController = new TextEditingController();
      String mPhoneText;
    
    
      List<String> nameItems = <String>[
        '微信',
        '朋友圈',
        'QQ',
        'QQ空间',
        '微博',
        'FaceBook',
        '邮件',
        '链接'
      ];
    
    // 这个urlItems这里没有用到
      List<String> urlItems = <String>[
        'static/images/mx_wx.png',
        'static/images/store.png',
        'static/images/mx_qq.png',
        'static/images/mx_wx.png',
        'static/images/mx_qq.png',
        'static/images/mx_qq.png',
        'static/images/mx_wx.png',
        'static/images/mx_qq.png'
      ];
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        // 方式一:默认设置宽度1080px,高度1920px
        ScreenUtil.instance = ScreenUtil.getInstance()..init(context);
        // 方式二:设置宽度750px,高度1334px
        ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);
        // 方式三:设置宽度750px,高度1334px,根据系统字体进行缩放
        ScreenUtil.instance = ScreenUtil(width: 750, height: 1334, allowFontScaling: true)..init(context);
        mContext=context;
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("对话框案例"),
            centerTitle: true,
            elevation: 0.25,
            backgroundColor: Colors.white,
            //automaticallyImplyLeading: false, //设置没有返回按钮
          ),
          body:new Stack(
            children: <Widget>[
              new ListView(
                children: <Widget>[
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          //takephotosDialogWidget(context);
                          showDialog(
                              barrierDismissible: true,//是否点击空白区域关闭对话框,默认为true,可以关闭
                              context: context,
                              builder: (BuildContext context) {
                                var list = List();
                                list.add('拍照');
                                list.add('从手机相册选择');
                                for(var i=3;i<8;i++){
                                  list.add('菜单'+i.toString());
                                }
                                return YDCBottomSheet(
                                  list: list,
                                  onItemClickListener: (index) async {
    
                                    Fluttertoast.showToast(
                                        msg: list[index],
                                        toastLength: Toast.LENGTH_SHORT,
                                        gravity: ToastGravity.BOTTOM,
                                        timeInSecForIos:1
    //            backgroundColor: Color(0xe74c3c),
    //            textColor: Color(0xffffff)
                                    );
                                        Navigator.pop(context);
    
                                  },
                                );
                              });
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
    
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出底部选择对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
    
                              ],
                            ),
    
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
                  dividerWidget,
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          shareDialogWidget(context);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出分享对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
    
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          showCupertinoAlertDialog(context);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
    
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出消息对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
    
                              ],
                            ),
    
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          showDialog<Null>(
                              context: context,
                              barrierDismissible: false,//点击遮罩不关闭对话框,对于自定义Dialog没起作用,需要在内部自己处理
                              builder: (context) {
                                //StatefulBuilder 来构建 dialog
                                //使用参数 state来更新 dialog 中的数据内容
                                return new CustomSureDialog(
                                  message: "我是中国人",
                                  sureEvent: () {
                                    print("确认 关闭");
                                    Navigator.pop(context);
                                  },
                                  onCloseEvent: () {
                                    print("取消 关闭");
                                    Navigator.pop(context);
                                  },
                                  //通过state来刷新内容
                                );
    
                              });
    
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出第二种消息提示对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          showDialog<Null>(
                              context: context,
                              barrierDismissible: false,//点击遮罩不关闭对话框
                              builder: (context) {
                                //StatefulBuilder 来构建 dialog
                                //使用参数 state来更新 dialog 中的数据内容
                                return new YDCMessageDialog(
                                  title: "我是title",
                                  message: "我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人",
                                  onPositivePressEvent: () {
                                    print("确认 关闭");
                                    Navigator.pop(context);
                                  },
                                  onCloseEvent: () {
                                    print("取消 关闭");
                                    Navigator.pop(context);
                                  },
                                  //通过state来刷新内容
                                );
    
                              });
    
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出第三种消息提示对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          showInputCupertinoAlertDialog(context);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
    
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出输入对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
    
                              ],
                            ),
    
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
    
                          List<String> list = [
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                            "666",
                          ];
                          YDCCommonUtils.showCommitOptionDialog(context, list, (index) {
                          }, height: 400.0);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
    
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出选择对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
    
                              ],
                            ),
    
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          showLoadingDialog(context);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出Loading对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          YDCCommonUtils.showLoadingDialog(context);
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出Loading第二种对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
                          YDCCommonUtils.showAlertDialog(context, "Bug修复");
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出升级对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
    
    
    
                  dividerWidget,
    
                  new Container(
                      color: const Color(0xFFFFFFFF),
                      height: 50.0,
                      child:new InkWell(
                        onTap: () {
    
                          showEvaluateDialog();
    
                        },
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Padding(
                                    padding: const EdgeInsets.only(left: 8.0),
                                    child: new Text("弹出服务评价对话框",
                                      style: new TextStyle(fontSize: 16.0, color:const Color(0xFF333333)),)),
                              ],
                            ),
                            new Row(
                              children: <Widget>[
    
    
                              ],
                            )
                          ],
                        ),
                      )
                  ),
                ],
              )
            ],
          ),
    
        );
      }
    
    
    
      Widget dividerWidget=new Container(
        //margin: const EdgeInsets.only( left: 10.0,right: 10.0),
          child: new Padding(
              padding: const EdgeInsets.only(left: 0.0,right: 0.0),
              child:
              new Divider(height: 1.0,indent: 0.0,color: Color(0xFFe5e5e5))
          )
    
      );
    
      shareDialogWidget(context){
        showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
              return _shareWidget();
            });
      }
      Widget _shareWidget() {
        return new Container(
          height: 250.0,
          child: new Column(
            children: <Widget>[
              new Padding(
                padding: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
                child: new Container(
                  height: 190.0,
                  child: new GridView.builder(
                    gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
                        crossAxisCount: 4,
                        mainAxisSpacing: 5.0,
                        childAspectRatio: 1.0),
                    itemBuilder: (BuildContext context, int index) {
                      return  new InkWell(
                          onTap: () {
                            Fluttertoast.showToast(
                                msg: "正在建设中...",
                                toastLength: Toast.LENGTH_SHORT,
                                gravity: ToastGravity.BOTTOM,
                                timeInSecForIos:1
    //            backgroundColor: Color(0xe74c3c),
    //            textColor: Color(0xffffff)
    
                            );
                          },
                          child:new Column(
                          children: <Widget>[
                          new Padding(
                              padding: EdgeInsets.fromLTRB(0.0, 6.0, 0.0, 6.0),
                              child: new Image.asset(urlItems[index],
                                 width: 30.0,
                                 height: 30.0,)),
                          new Text(nameItems[index])
                        ],
                      ));
                    },
                    itemCount: nameItems.length,
                  ),
                ),
              ),
              new Container(
                height: 0.5,
                color: Colors.blueGrey,
              ),
              new Center(
                child: new Padding(
                  padding: EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0),
                  child: GestureDetector(
                      onTap:(){
                        Navigator.of(context).pop();
                      },
                      child: new Text(
                        '取  消',
                        style: new TextStyle(fontSize: 18.0, color: Colors.blueGrey),
                      )),
                ),
              ),
            ],
          ),
        );
    
      }
    
      showCupertinoAlertDialog(context) {
        showDialog(context: context,
            builder: (BuildContext context) {
             return CupertinoAlertDialog(
                title: Text('我是标题'),
                content:Text('我是content'),
                actions:<Widget>[
                  CupertinoDialogAction(
                    child: Text('取消'),
                    onPressed: (){
                      print('yes...');
                      Navigator.of(context).pop();
                    },
                  ),
                  CupertinoDialogAction(
                    child: Text('确定'),
                    onPressed: (){
                      print('no...');
                      Navigator.of(context).pop();
                    },
                  ),
                ],
              );
    
        });
    
      }
    
    
      showInputCupertinoAlertDialog(context) {
        showDialog(
            context: context,
            builder: (context) {
              return CupertinoAlertDialog(
                title: Text('温馨提示'),
                content: Card(
                  elevation: 0.0,
                  child: Column(
                    children: <Widget>[
                      TextField(
                        decoration: InputDecoration(
                            hintText: '请输入内容',
                            filled: true,
                            fillColor: Colors.grey.shade50),
                            onChanged: (String value){
                        },
                      ),
    
                    ],
                  ),
                ),
                actions: <Widget>[
                  CupertinoDialogAction(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: Text('取消'),
                  ),
                  CupertinoDialogAction(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: Text('确定'),
                  ),
                ],
              );
            });
    
    
      }
    
      showLoadingDialog(context) {
        showDialog<Null>(
          context: context, //BuildContext对象
          barrierDismissible: true,
          builder: (BuildContext context) {
            return new YDCLoadingDialog( //调用对话框
              text: '正在处理中...',
            );
          });
      }
    
      //是否满意标识位记录
      int pariseSelectIndex = 0;
      //不满意原因标识位记录
      int pariseSelectIndex2 = 0;
      //在按钮点击的时候直接调用
      void showEvaluateDialog() {
        showDialog<Null>(
            context: context,
            //点击背景不消失
            barrierDismissible: true,
            builder: (context) {
              //StatefulBuilder 来构建 dialog
              //使用参数 state来更新 dialog 中的数据内容
              return StatefulBuilder(builder: (context, state) {
                //创建dialog
                return new YDCCustomDialog(
                  title: "服务完成给个好评价吧!",
                  negativeText: "取消",
                  positiveText: "确认",
                  isShowTitleDivi: false,
                  onPositivePressEvent: () {
                    print("确认 关闭");
                    Navigator.pop(context);
                  },
                  onCloseEvent: () {
                    print("取消 关闭");
                    Navigator.pop(context);
                  },
                  //通过state来刷新内容
                  childWidget: buildPariseChildDialog(state),
                );
              });
            });
      }
    
      Widget buildPariseChildDialog(state){
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Row(
              //填充
              mainAxisSize: MainAxisSize.max,
              //平分空白
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                buildPariseChildWidget(
                    0, "非常满意", pariseSelectIndex == 0 ? true : false,state),
                buildPariseChildWidget(
                    1, "满意", pariseSelectIndex == 1 ? true : false,state),
                buildPariseChildWidget(
                    2, "不满意", pariseSelectIndex == 2 ? true : false,state),
              ],
            ),
            pariseSelectIndex==2?gridViewDefaultCount(state):Container(),
          ],
        );
      }
    
      Widget buildPariseChildWidget(int index, String message, bool select,state) {
        return Expanded(
          flex: 1,
          child: Container(
            margin: EdgeInsets.only(left: 5.0, right: 5.0),
            //设置 child 居中
            alignment: Alignment(0, 0),
            height: 30,
            child: new Center(
              child: new Material(
                child: new Ink(
                  key: ValueKey(index),
                  //设置背景
                  decoration: new BoxDecoration(
                    //背景
                    color: Colors.white,
                    //设置四周圆角 角度 这里的角度应该为 父Container height 的一半
                    borderRadius: BorderRadius.all(Radius.circular(15.0)),
                    //设置四周边框
                    border: new Border.all(
                        width: 1, color: select ? Colors.red : Colors.grey),
                  ),
                  child: new InkResponse(
                    borderRadius: new BorderRadius.all(new Radius.circular(15.0)),
                    //点击或者toch控件高亮时显示的控件在控件上层,水波纹下层
                    highlightColor: Color(0xfffbfbfb),
                    //点击或者toch控件高亮的shape形状
                    highlightShape: BoxShape.rectangle,
                    //.InkResponse内部的radius这个需要注意的是,我们需要半径大于控件的宽,如果radius过小,显示的水波纹就是一个很小的圆,
                    //水波纹的半径
                    radius: 0.0,
                    //水波纹的颜色 设置了highlightColor属性后 splashColor将不起效果
                    splashColor: Color(0xfffbfbfb),
                    //true表示要剪裁水波纹响应的界面   false不剪裁  如果控件是圆角不剪裁的话水波纹是矩形
                    containedInkWell: true,
    
                    onTap: () {
                      pariseSelectIndex = index;
                      print('click ' + pariseSelectIndex.toString());
                      state(() {});
                    },
                    child: new Container(
                      //不能在InkResponse的child容器内部设置装饰器颜色,否则会遮盖住水波纹颜色的,containedInkWell设置为false就能看到是否是遮盖了。
                      width: 300.0,
                      height: 50.0,
                      //设置child 居中
                      alignment: Alignment(0, 0),
                      child: Text(
                        message,
                        style: TextStyle(
                            color: select ? Colors.red : Colors.grey,
                            fontSize: 14.0),
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ),
        );
      }
    
      Widget gridViewDefaultCount(state) {
        int count = 3;
        double height = 60;
    
        return Container(
          margin: EdgeInsets.only(top: 20),
          //设置 child 居中
          alignment: Alignment(0, 0),
          height: height,
          //边框设置
          decoration: new BoxDecoration(
            //背景
            color: Color(0xfff6f6f6),
            //设置四周圆角 角度
            borderRadius: BorderRadius.all(Radius.circular(4.0)),
            //设置四周边框
            border: new Border.all(width: 1, color: Color(0xfff6f6f6)),
          ),
          child: initListWidget(count,state),
        );
      }
    
      Widget initListWidget(int count,state) {
        List<Widget> lists = [];
        List<Widget> clists = [];
    
        lists.add(buildPariseSelectChildWidget(
            0, "送货慢", pariseSelectIndex2 == 0 ? true : false,state));
        lists.add(buildPariseSelectChildWidget(
            1, "服务差", pariseSelectIndex2 == 1 ? true : false,state));
        lists.add(buildPariseSelectChildWidget(
            2, "态度不好", pariseSelectIndex2 == 2 ? true : false,state));
        clists.add(Row(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: lists,
        ));
    
        return Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: clists,
        );
      }
    
      Widget buildPariseSelectChildWidget(int index, String message, bool select,state) {
        return InkWell(
          //单击事件响应
          onTap: () {
    
            pariseSelectIndex2 = index;
            state(() {});
          },
          child: Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Image.asset(
                select
                    ? "static/images/check.png"
                    : "static/images/uncheck.png",
                width: 20.0,
                height: 20.0,
              ),
              Padding(
                child: Text(
                  message,
                  style: TextStyle(fontSize: 13, color: Color(0xff666666)),
                ),
                padding: EdgeInsets.only(left: 5.0),
              )
            ],
          ),
        );
      }
    
    
      @override
      void dispose() {
        super.dispose();
    
      }
    
    }
    

    Flutter电商实战项目:https://github.com/dechengyang/ydc_flutter_app

    如果对你有帮助,随意赏我奶粉钱吧,多谢!

    微信:
    在这里插入图片描述
    支付宝:
    在这里插入图片描述

    展开全文
  • 如何在网页中显示选择文件对话框

    千次阅读 2009-09-11 11:13:00
    如果使用Microsoft的公共对话框组件就方便很多了,它可以一次就选择多个文件,就像QQ空间的相片上传功能一样。如何实现呢?经过多次试验,终于搞掂。源代码如下: 获取硬盘上的所有驱动器,文件夹和文件

    在制作网页时,经常要选择文件并上传,使用传统的InputFile控件,每次只能选择一个文件,甚为不便。如果使用Microsoft的公共对话框组件就方便很多了,它可以一次就选择多个文件,就像QQ空间的相片上传功能一样。如何实现呢?经过多次试验,终于搞掂。

    源代码如下:

     

     

    至于对话框参数设置,可参考下面说明
    打开或保存对话框参数
    常数                                                            值                                 描述
    cdlOFNAllowMultiselect                       &H200              它指定文件名列表框允许多重选择。
    运行时,通过按 SHIFT 键以及使用 UP ARROW 和 DOWN ARROW 键可选择多个文件。作完此操作后,FileName 属性就返回一个包含全部所选文件名的字符串。串中各文件名用空格隔开。
    cdlOFNCreatePrompt                            &H2000           当文件不存在时对话框要提示创建文件。该标志自动设置 cdlOFNPathMustExist 和 cdlOFNFileMustExist 标志。
    cdlOFNExplorer                                      &H80000         它使用类似资源管理器的打开一个文件的对话框模板。适用于 Windows 95 和 Windows NT 4.0。
    CdlOFNExtensionDifferent                   &H400               它指示返回的文件扩展名与 DefaultExt 属性指定的扩展名不一致。如果 DefaultExt 属性是 Null,或者扩展相匹配,或者没有扩展时,此标志不设置。当关闭对话框时,可以检查这个标志的值。
    cdlOFNFileMustExist                             &H1000           它指定只能输入文件名文本框已经存在的文件名。如果该标志被设置,则当用户输入非法的文件名时,要显示一个警告。该标志自动设置 cdlOFNPathMustExist 标志。
    cdlOFNHelpButton                                &H10                使对话框显示帮助按钮。
    cdlOFNHideReadOnly                           &H4                  隐藏只读复选框。
    cdlOFNLongNames                               &H200000       使用长文件名。
    cdlOFNNoChangeDir                            &H8                  强制对话框将对话框打开时的目录置成当前目录。
    CdlOFNNoDereferenceLinks               &H100000        不要间接引用外壳链接(也称作快捷方式)。缺省时,选取外壳链接会引起它被外壳间接引用。
    cdlOFNNoLongNames                           &H40000          无长文件名。
    CdlOFNNoReadOnlyReturn                  &H8000           它指定返回的文件不能具有只读属性,也不能在写保护目录下面。
    cdlOFNNoValidate                                  &H100              它指定公共对话框允许返回的文件名中含有非法字符。
    cdlOFNOverwritePrompt                     &H2                  使“另存为”对话框当选择的文件已经存在时应产生一个信息框,用户必须确认是否覆盖该文件。
    cdlOFNPathMustExist                           &H800              它指定只能输入有效路径。如果设置该标志,输入非法路径时,应显示一个警告信息。
    cdlOFNReadOnly                                    &H1                  建立对话框时,只读复选框初始化为选定。该标志也指示对话框关闭时只读复选框的状态。
    cdlOFNShareAware                               &H4000           它指定忽略共享冲突错误。
     

    展开全文
  •  在上一讲中介绍了MFC的消息映射机制,属于原理方面的知识。... 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,qq的主界面其实就是个对话框,只是它做了很多美工方...
  • 今天修改QQ空间描述,提示对话框“用户信息更新失败!”弄得我满处百度,几般尝试,可就是无法修改描述。结果,果断想起是不是没修改资料,跑去QQ个人中心官网,把星座那些刚才改生日自动填写的资料全修改为不填写,...
  • 进入加密的QQ空间方法

    千次阅读 2013-04-13 07:01:38
    进入加密的QQ空间方法一:  需有两个QQ号码。如果想进入加密qq空间,我们可以把我们的第一个QQ号码的空间加上密码。然后用第二个QQ号码访问第一个QQ号码的加密空间。我们  输入密码进入加密的QQ空间后。在地址栏...
  • Android图文混排(仿QQ空间评论)

    千次阅读 2016-12-22 09:31:14
    之前项目需求,做一个类似QQ的点赞评论功能,效果图如下: 本文主要讲解评论这一块,至于点赞和表情帖,后续再说。 评论功能的介绍:评论内容显示:“发表评论用户”+评论内容+翻译图标。点击...
  • VC学习笔记:对话框

    2017-05-08 14:53:50
    VC学习笔记:对话框SkySeraph NOV.11st 2009 HQUEmail-zgzhaobo@gmail.com QQ-452728574Latest Modified Date:Oct.31th 2010 HQU 重新翻阅整理//说明:孙鑫视频学习笔记 SkySeraph NOV.11st 2009 HQU/*【对话框专题...
  • QQ群和QQ空间中挂马

    千次阅读 2008-10-16 13:54:00
    有无数人每天都在使用QQ ,大家往往注重于QQ尾巴病毒、QQ传木马之类的攻击方式,却很少有人注意到我们经常访问的QQ群、QQ空间里面隐藏着更大的安全危险,远比QQ尾巴病毒、QQ传木马之类的隐蔽得多,危害更加大。...
  • 版权声明:本文为HaiyuKing原创文章,转载请注明...ShareDialog.java:分享对话框,继承DialogFragment【按常理来讲,应该继承BottomSheetDialog,但是考虑到可能需要请求接口获取分享缩略图,所以继承DialogFragme...
  • (011)吐司 菜单 对话框

    2016-11-19 11:17:43
    今天给大家分享一下安卓开发中一些“有的没的”比如说:吐司 菜单 对话框。 一, 菜单 res/menu1, 选项菜单 (系统菜单) OptionsMenu 当前Activity调用 一个Activity只能有一个系统菜单1.1 创建方式: 高版本的创建 在...
  • 在Android开发中,对话框也和我们的TitleBar一样,有各种样式,而且它比TitleBar更加的复杂,因为对话框显示的位置还有底部显示,中心显示,顶部显示,以及动画等,因此。对于对话框,我们也可以封装以下。这里我们...
  • 在C#中,MessageBox消息对话框位于System.Windows.Forms命名空间中,一般情况,一个消息对话框包含信息提示文字内容、消息对话框的标题文字、用户响应的按钮及信息图标等内容。C#中允许开发人员根据自己的需要设置...
  • C#-WinForm-对话框控件

    2016-12-13 01:05:00
    对话框控件 设置点击按钮弹出对话框控件 1、colorDialog - 颜色对话框 接收确定返回的信息 ======================================================== 2、fontDialog - 字体对话框 接收 确定返回的...
  • 在Revit API 论坛里看到了...1.在对话框显示的时候,复写删除命令 2.写一个外部命令来删除1中复写的命令 3.在对话框关闭后调用这个外部事件 下面是关键代码:  UIApplication uiapp = commandData.Applicatio
  • QQ 空间免费装扮

    千次阅读 2008-10-04 19:05:00
    http://wenwen.soso.com/z/q85078482.htm首先打开空间免费背景音乐操作方法 点音乐盒>>>点添加音乐>>>【点添加网络音乐(右上角)】>>>根据提示填上>>>点提交,自己喜欢的音乐都可以这样加上去,但还没有背景音乐 点...
  • artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口 l自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应,因此你不必去考虑消息内容尺寸...
  • 一、本节课程 C++ ARX二次开发-MFC ...显示一个非模态对话框的步骤和代码编写。 三、具体内容 1、思路: 显示一个非模式对话框: yunyou.ke.qq.com pDialog=new CModalessDlg(acedGetAcadFrame()); pD...
  • 目前有很多的SNS社区或类SNS的网站,例如开心、51、校内等,但是发现大多数社区在邀请好友的时候都没有提供对QQ邮箱或者QQ空间好友列表获取的功能,不过似乎海内支持,但是网上相关QQ的文章还不是很多,希望这篇文章...
  • 1、文件打开对话框: [filename ,pathname]=uigetfile()函数: 用法: [filename ,pathname]=uigetfile(filterspec,'dialogtitle','defaultname','MultiSelect','on') 解释: pathname表示所读取的文件在那个...
  • 对话框中加入属性页

    千次阅读 2011-09-15 16:48:40
    对话框中加入属性页 作者:黄晨量 下载本文全部源代码 当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置。本文针对这种方法来讨论几种可能实现的方案。 方案一 本...
  • Android 自定义弹出菜单和对话框

    千次阅读 2017-08-14 09:48:43
    Android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupWindow),以及自定义对话框(Dialog)。 话不多说,直接上图片。 先讲第一种,自定义PopUpWindow 1.popupWindowprotected ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,516
精华内容 3,406
关键字:

qq对话框显示空间动态