动画效果显示对话框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动画效果显示对话框相关的知识,希望对你有一定的参考价值。

请问怎么让无模式对话框按动画方式显示和消失,请注意是无模式对话框。
另外,请不要随便在网上找段就代码贴上来,至少也试试看能实现么
谢谢~

参考技术A 无模式对话框是通过调用 ShowWindow来显示的。
在此无模式对话框里面定义一个时钟来实现吧,通过blend操作来实现窗口的淡入淡出动画效果。
响应wm_showwindow消息,根据是sw_show,还是sw_hide,来决定是淡入(显示),淡出(关闭)操作。
半透明效果可以用 AlphaBlend 或 SetLayeredWindowAttributes 来实现,具体看MSDN。
够详细了吧,再写不出来,就撞墙去吧。
参考技术B #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#undef WINVER //取消原有版本定义,重新定义版本
#define WINVER 0x5000 //为了使AnimateWindow函数可用

//在stdafx.h里加上面两句
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls

void CDLG2Dlg::OnClose() //在onclose里加

// TODO: Add your message handler code here and/or call default
AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER);
this->DestroyWindow();
CDialog::OnClose();
本回答被提问者采纳
参考技术C AnimateWindow
The AnimateWindow function enables you to produce special effects when showing or hiding windows. There are three types of animation: roll, slide, and alpha-blended fade.

BOOL AnimateWindow(
HWND hwnd, // handle to window
DWORD dwTime, // duration of animation
DWORD dwFlags // animation type
);

Requirements
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Included in Windows 98 and later.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.

Android仿美团加载数据 小人奔跑进度动画对话框(附顺丰快递员奔跑效果)

我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation)。帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果。
 
   今天我们主要来模仿一下美团中加载数据时小人奔跑动画的对话框效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!话不多少,先上效果图,让各位大侠看看是不是你想要实现的效果,然后再决定是否往下阅读,因为做为程序员我们的时间都很宝贵,毕竟还没有女朋友呢?
(ps:因为技术原因,提供的动态图效果不是很明显,但在手机上运行是非常好的,有兴趣的朋友可以下载源码看看。)
技术图片技术图片

    下面讲讲实现的原理,首先我们在项目的res目录下新建一下anim文件夹,然后新建一个xml文件,添加如下代码:
[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:oneshot="false" >  
  4.   
  5.     <item  
  6.         android:drawable="@drawable/app_loading0"  
  7.         android:duration="150"/>  
  8.     <item  
  9.         android:drawable="@drawable/app_loading1"  
  10.         android:duration="150"/>  
  11.   
  12. </animation-list>  
 
animation-list 是动画列表,中间放很多的item 也就是组成帧动画的图片,
android:drawable[drawable]//加载Drawable对象
android:duration[long]//每一帧动画的持续时间(单位ms)
     android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

 写好之后我们来看自定义一个对话框,来实现打开对话框时,自动加载奔跑的动画。见代码:
[java] view plaincopy
 
  1. /** 
  2.  * @Description:自定义对话框 
  3.  * @author http://blog.csdn.net/finddreams 
  4.  */  
  5. public class CustomProgressDialog extends ProgressDialog {  
  6.   
  7.     private AnimationDrawable mAnimation;  
  8.     private Context mContext;  
  9.     private ImageView mImageView;  
  10.     private String mLoadingTip;  
  11.     private TextView mLoadingTv;  
  12.     private int count = 0;  
  13.     private String oldLoadingTip;  
  14.     private int mResid;  
  15.   
  16.     public CustomProgressDialog(Context context, String content, int id) {  
  17.         super(context);  
  18.         this.mContext = context;  
  19.         this.mLoadingTip = content;  
  20.         this.mResid = id;  
  21.         setCanceledOnTouchOutside(true);  
  22.     }  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         initView();  
  28.         initData();  
  29.     }  
  30.   
  31.     private void initData() {  
  32.   
  33.         mImageView.setBackgroundResource(mResid);  
  34.         // 通过ImageView对象拿到背景显示的AnimationDrawable  
  35.         mAnimation = (AnimationDrawable) mImageView.getBackground();  
  36.         // 为了防止在onCreate方法中只显示第一帧的解决方案之一  
  37.         mImageView.post(new Runnable() {  
  38.             @Override  
  39.             public void run() {  
  40.                 mAnimation.start();  
  41.   
  42.             }  
  43.         });  
  44.         mLoadingTv.setText(mLoadingTip);  
  45.   
  46.     }  
  47.   
  48.     public void setContent(String str) {  
  49.         mLoadingTv.setText(str);  
  50.     }  
  51.   
  52.     private void initView() {  
  53.         setContentView(R.layout.progress_dialog);  
  54.         mLoadingTv = (TextView) findViewById(R.id.loadingTv);  
  55.         mImageView = (ImageView) findViewById(R.id.loadingIv);  
  56.     }  
  57.   
  58. }  

         可以看到在代码中,我们使用到一个imageview.post(Runnable r)方法,因为帧动画需要不断的重画,所以必须在线程中运行,否则只能看到第一帧的效果,这和我们做游戏的原理是一样的,一个人物的走动,是有线程在控制图片的不断重画。
   当然还有另外一个方法也能实现:
[java] view plaincopy
 
  1. @Override  
  2.     public void onWindowFocusChanged(boolean hasFocus) {  
  3.         // TODO Auto-generated method stub  
  4.         mAnimation.start();   
  5.         super.onWindowFocusChanged(hasFocus);  
  6.     }  
     
    最后就是在Activity中调用了,详情:
[java] view plaincopy
 
  1. CustomProgressDialog dialog =new CustomProgressDialog(this"正在加载中",R.anim.frame);  
  2.         dialog.show();  

        对于CustomProgressDialog这个自定义对话框类是封装的比较好的,调用起来十分方便,你可以快速的替换成你想要的效果,只需更改图片就可以了。

最后附上源代码,还不够理解的朋友可以下载看看,希望对你有所帮助;

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

以上是关于动画效果显示对话框的主要内容,如果未能解决你的问题,请参考以下文章

AnimateWindow函数怎么使用

Android:PopupWindow动画显示效果

jQuery动画(显示隐藏,淡入淡出,滑动)

显示 DialogFragment 动画从一个点开始

Android 按键 亮度对话框滑动时不能消失,点击或滑动需要动态改变亮度值和动画效果

JavaScript之jQuery-5 jQuery 动画效果(隐藏和显示自定义动画并发与排列效果)