【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的dialog控制焦点导致其后Activity不响应

一、修改方法 public MenuDialog(Context context, int theme) { super(context, theme); WindowManager.Layo...
  • tankai19880619
  • tankai19880619
  • 2015年01月09日 19:05
  • 4598

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

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

Android 自定义Dialog多种效果 源码

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

Android自定义类似ProgressDialog效果的Dialog

  • 2016年03月31日 14:07
  • 1.77MB
  • 下载

Android 自定义Dialog,文字动态加载效果

  • 2016年06月26日 13:51
  • 20.56MB
  • 下载

Android自定义类似ProgressDialog效果的Dialog

  • 2016年09月08日 09:27
  • 2.2MB
  • 下载

Android进度条自定义——类似ProgressDialog效果的Dialog

方法如下: 1.首先准备两张自己要定义成哪样子的效果的图片和背景图片(也可以不要背景)。 如我要的效果: 2.定义loading_dialog.xml布局文件...
  • lalate
  • lalate
  • 2016年05月18日 16:02
  • 1111

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

话不多说,直接上代码: AlertDialog.Builder builder = new Builder(HomeActivity.this); View view = View.infla...
  • u011240877
  • u011240877
  • 2015年05月09日 02:07
  • 2681

Android自定义类似ProgressDialog效果的Dialog

Android自定义类似ProgressDialog效果的Dialog. 方法如下: 1.首先准备两张自己要定义成哪样子的效果的图片和背景图片(也可以不要背景)。 如我要的效果: ...
  • qjlhlh
  • qjlhlh
  • 2012年09月14日 15:17
  • 126094

Android 自定义Dialog,文字动态加载效果。

之前在技术问答上面看到一个提问 “加载中…” 后面三个点是动态的,这么一个效果实现。想来想去,好像没想到好的处理方式。 尝试了一下,以一个最笨的方式实现了。先来看一下效果 : 我是通过自...
  • lv_fq
  • lv_fq
  • 2016年06月26日 14:08
  • 4128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android自定义Dialog】电视机开关效果的Dialog
举报原因:
原因补充:

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