您的位置:首页 > 移动开发 > Android开发

【Android自定义Dialog】电视机开关效果的Dialog

2015-11-19 16:27 501 查看
前言:

今天没有什么工作要做,就准备网上找个源码解剖下,找些干货耍耍。在DEV资源网找到了这个http://www.devstore.cn/code/info/1144.html【Android音乐播放器(歌词.均衡器.收藏.qq5.0菜单.通知)】,看了一个早上,发现些不错的东西,这里先抽取其中的一个自定义Dialog介绍给大家。(项目源码里介绍这个Dialog是来自优酷客户端的)

废话不多说,这里先给大家看看这个酷炫的电视开关效果的Dialog:



这里我用一个Button去展示这个Dialog,本文并没有太多内容,其实主要就是给Dialog加了个动画

只要继承TVAnimDialog这个类就可以实现这个酷炫的效果了

使用:

public void showTVAnimDialog(View v){
MyDialog mDialog = new MyDialog(this);
mDialog.show();
}


MyDialog的代码:

package com.mw.tvanimdialogdemo;

import com.mw.tvanimdialogdemo.dialog.TVAnimDialog;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MyDialog extends TVAnimDialog {

private Button button;

public MyDialog(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

protected MyDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
// TODO Auto-generated constructor stub
}

public MyDialog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
}

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_test);
button = (Button) findViewById(R.id.dialog_about_btn_ok);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dismiss();
}
});
}

}


TVAnimDialog类的代码:

package com.mw.tvanimdialogdemo.dialog;

import com.mw.tvanimdialogdemo.R;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;

/**
* By CWD 2013 Open Source Project
*
* <br>
* <b>电视机开关效果的Dialog</b></br>
*
* <br>
* 取自优酷视频客户端退出时电视机关闭动画效果,返向推出打开效果,继承该类就带有该动画效果</br>
*
* @author CWD
* @version 2013.07.31 v1.0 实现动画效果 <br>
*          2013.08.01 v1.1 实现对话框关闭的监听 </br>
*/
public class TVAnimDialog extends Dialog {

private int dialogId = MyConstant.DIALOG_DISMISS;
private OnTVAnimDialogDismissListener listener;

public TVAnimDialog(Context context) {
super(context, R.style.TVAnimDialog);// 此处附上Dialog样式
// TODO Auto-generated constructor stub
}

public TVAnimDialog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
}

protected TVAnimDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
// TODO Auto-generated constructor stub
}

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
getWindow().setWindowAnimations(R.style.TVAnimDialogWindowAnim);// 此处附上Dialog动画
}

@Override
public void dismiss() {
// TODO Auto-generated method stub
super.dismiss();
if (listener != null) {
listener.onDismiss(dialogId);
}
}

/**
* 用于区分Dialog用途
*
* @param dialogId
*            Dialog ID
*/
public void setDialogId(int dialogId) {
this.dialogId = dialogId;
}

/**
* 设置监听器
*
* @param listener
*            OnTVAnimDialogDismissListener
*/
public void setOnTVAnimDialogDismissListener(
OnTVAnimDialogDismissListener listener) {
this.listener = listener;
}

/**
* 用于监听对话框关闭的接口
*/
public interface OnTVAnimDialogDismissListener {
/**
* 对话框关闭
*
* @param dialogId
*            Dialog ID
*/
void onDismiss(int dialogId);
}

}


里面用到了自定义样式R.style.TVAnimDialog和R.style.TVAnimDialogWindowAnim,需要在style.xml文件添加如下代码:

<style name="TVAnimDialog" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
</style>

<style name="TVAnimDialogWindowAnim" mce_bogus="1" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_tv_on</item>
<item name="android:windowExitAnimation">@anim/dialog_tv_off</item>
</style>


接下来,样式里面使用到的2个动画是本文的关键之处,需要在res目录下创建文件夹“anim”,放入两个文件

dialog_tv_on.xml与dialog_tv_off.xml(开启动画/关闭动画)

dialog_tv_on.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top" >

<!-- 电视机打开动画效果,返向更改off动画实现 -->

<scale
android:duration="200"
android:fromXScale="0.0"
android:fromYScale="0.3"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toXScale="1.0"
android:toYScale="1.0" />
<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="0.003"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:startOffset="250"
android:toXScale="1.0"
android:toYScale="1.0" />

<alpha
android:duration="400"
android:fillAfter="true"
android:fillEnabled="true"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />

</set>


dialog_tv_off.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top" >

<!-- 电视机关闭动画效果,源码来自优酷视频客户端 -->

<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toXScale="1.0"
android:toYScale="0.003" />
<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:startOffset="200"
android:toXScale="0.0"
android:toYScale="0.3" />

<alpha
android:duration="400"
android:fillAfter="true"
android:fillEnabled="true"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0" />

</set>


Demo代码下载地址:http://download.csdn.net/detail/jingleye/9283169

致谢:
首先这里感谢文章引用Dev源码资源的提供者——mylove1

这里要谢谢鸿洋大神引荐的一款gif制作软件LICEcap,附上地址http://www.cockos.com/licecap/

喜欢的话要顶一下哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: