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

原创 2015年11月19日 16:27:25

前言

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


喜欢的话要顶一下哦~

相关文章推荐

关于Android TV应用开发的心得体会

从去年开始搞Android TV应用开发差不多快一年了,虽然中间有个几个月没搞,不过现在总算还是回到正轨上来了,所以记录一下自己的一些收获和体会,大家有什么好的建议也欢迎留言分享,本文不间断更新。这里...

Android——超炫dialog弹窗效果,及自定义view dialog

在实际开始种,每个android应用或多或少都会有一些dialog的弹窗,系统自带v7的还能看,v4就实在看不下去了,太他妈丑了。有些开发者闲麻烦,只能自己写一个layout实现,但是这样又不麻烦吗?...

Android TV开发总结(六)构建一个TV app的直播节目实例

近年来,Android TV的迅速发展,传统的有线电视受到较大的冲击,在TV上用户同样也可以看到各个有线电视的直播频道,相对于手机,这种直播节目,体验效果更佳,尤其是一样赛事节目,大屏幕看得才够痛快,...

android自动屏幕旋转流程分析

在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如果我们勾选checkbox的话当你手机屏幕就会根据重量...

EasyDSS流媒体服务器实现RTMP直播同步HLS录像和时移回放

本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/74166337“目前在市面上可以找到的rtmp各种...

Android 自定义Dialog多种效果 源码

  • 2015年10月15日 21:36
  • 5.65MB
  • 下载

Android实现自定义AlertDialog的自下向上的动画效果(并消除dialog边框)

话不多说,直接上代码: AlertDialog.Builder builder = new Builder(HomeActivity.this); View view = View.infla...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android自定义Dialog】电视机开关效果的Dialog
举报原因:
原因补充:

(最多只允许输入30个字)