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

前言

今天没有什么工作要做,就准备网上找个源码解剖下,找些干货耍耍。在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/


喜欢的话要顶一下哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章