精华内容
下载资源
问答
  • 但是对于前端来说,实现动画的方法也很多种,今天博主就来和各位一起探讨一下,实现动画几种方式。 JS直接实现 最为简单暴力无脑的一种操作,通过js修改div(盒子模型)的属性以及运用 setTimeOut() 方法实现...

    现在对于前端的要求变大了很多,随着时代进步,人们的审美越来越挑剔,对于用户交互的体验成为了公司竞争的一大助力。而动画效果,可以说是最有效的提高用户体验的方式了。但是对于前端来说,实现动画的方法也有很多种,今天博主就来和各位一起探讨一下,实现动画的几种方式。

    JS直接实现

    最为简单暴力无脑的一种操作,通过js修改div(盒子模型)的属性以及运用 setTimeOut() 方法实现动画。

    • 实现:
    	<!DOCTYPE html>
    <html lang="en">
    
    	<head>
    		<meta charset="UTF-8">
    		<style type="text/css">
    			#rect {
    				width: 200px;
    				height: 200px;
    				background: #ccc;
    			}
    		</style>
    	</head>
    	
    	<body>
    		<div id="rect"></div>
    		<script>
    			//获取rect元素
    			var elem = document.getElementById('rect');
    			var left = 0;
    			//定时器实现移动效果
    			var timer = setInterval(function() {
    				if(left < window.innerWidth - 200) {
    					elem.style.marginLeft = left + 'px';
    					left++;
    				} else {
    					clearInterval(timer);
    				}
    			}, 16);
    		</script>
    	</body>
    </html>
    
    • 效果图:以上代码可以直接运行,复制到编译器即可。
    • 补充:jquery有自己封装一些常见的动画效果。你可以通过点击这段话进行详细访问
    • 代码解析:
      1.通过JS获取元素。
      2.通过setInterval()定时器实现marginLeft样式的修改从而实现动画效果。

    SVG

    SVG 是使用 XML 来描述二维图形和绘图程序的语言。-

    • 实现:
    <!DOCTYPE html>
    <html lang="en">
    
    	<head>
    		<meta charset="UTF-8">
    		<title>Document</title>
    		<style>
    			* {
    				margin: 0;
    				padding: 0;
    			}
    		</style>
    	</head>
    
    	<body>
    		<svg id="box" width="800" height="400" xmlns="http://www.w3.org/2000/svg" version="1.1">
    			<rect x="" y="" width="100" height="100" fill="rgb(255,0,0);" stroke="" stroke-width="">
    				<set attributeName="x" attributeType="XML" to="100" begin="4s" />
    				<animate attributeName="x" attributeType="XML" begin="0s" dur="4s" from="0" to="300" />
    				<animate attributeName="y" attributeType="XML" begin="0s" dur="4s" from="0" to="300" />
    				<animateTransform attributeName="transform" begin="0s" dur="4s" type="scale" from="1" to="2" repeatCount="1" />
    				<animateMotion path="M10,80 q100,120 120,20 q140,-50 160,0" begin="0s" dur="4s" repeatCount="1" />
    			</rect>
    		</svg>
    
    	</body>
    
    </html>
    
    • 效果图:以上代码可以直接运行,各位自行编译即可。
    • 代码解析
      1.包含animate标签的为相互覆盖的关系,各位可以通过注释其他行看到该行实现的动画效果。
      2.如果想要详细了解请找度娘。

    CSS3 transition

    transition是过渡动画,具体效果请看演示。

    • 实现
    <!DOCTYPE html>
    <!DOCTYPE html>
    <html lang="en">
    
    	<head>
    		<meta charset="UTF-8">
    		<style type="text/css">
    			#rect {
    				width: 200px;
    				height: 200px;
    				transform: width 2s;
    				background: #ccc;
    				-moz-transition: width 2s;
    				/* Firefox 4 */
    				-webkit-transition: width 2s;
    				/* Safari and Chrome */
    				-o-transition: width 2s;
    				/* Opera */
    			}
    			
    			#rect:hover {
    				width: 500px;
    			}
    		</style>
    	</head>
    	
    	<body>
    		<div>请将鼠标移入方块</div>
    		<div id="rect"></div>
    	</body>
    
    </html>
    
    • 效果图:以上代码可以直接运行,各位自行编译即可。

    • 注意:
      在移动端开发中,直接使用transition动画会让页面变慢甚至卡顿。所以我们通常添加**transform:translate3D(0,0,0)transform:translateZ(0)**来开启移动端动画的GPU加速,让动画过程更加流畅。

    CSS3 animation

    更加直白简单好用的属性。

    • 示例:
    <!DOCTYPE html>
    <html lang="en">
    
    	<head>
    		<meta charset="UTF-8">
    		<style >
    			div {
    				width: 100px;
    				height: 100px;
    				background: red;
    				position: relative;
    				animation: mymove 5s infinite;
    				-webkit-animation: mymove 5s infinite;
    				/*Safari and Chrome*/
    			}
    			
    			@keyframes mymove {
    				from {
    					left: 0px;
    				}
    				to {
    					left: 200px;
    				}
    			}
    			
    			@-webkit-keyframes mymove
    			/*Safari and Chrome*/
    			
    			{
    				from {
    					left: 0px;
    				}
    				to {
    					left: 200px;
    				}
    			}
    		</style>
    	</head>
    
    	<body>
    
    		<p><strong>注释:</strong>Internet Explorer 9 以及更早的版本不支持 animation 属性。</p>
    
    		<div></div>
    
    	</body>
    
    </html>
    
    • 效果图:以上代码可以直接运行,各位自行编译即可。

    requestAnimationFrame

    requestAnimationFrame是另一种Web API,原理与setTimeout和setInterval类似,都是通过javascript持续循环的方法调用来触发动画动作。
    但它与setTimeOut()不同的是,他是根据浏览器的刷新同步进行动画。而定时器是按照自己的思路走的。(我不要你觉得,我要我觉得的那种)

    • 示例:
    <!DOCTYPE html>
    <html>
    
    	<head>
    		<title></title>
    		<style type="text/css">
    			* {
    				margin: 0;
    				padding: 0;
    			}
    			
    			div {
    				width: 200px;
    				height: 200px;
    				background-color: #ccc;
    			}
    		</style>
    	</head>
    
    	<body>
    		<div id="rect"></div>
    		<script type="text/javascript">
    			window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
    				window.msRequestAnimationFrame;
    
    			var elem = document.getElementById("rect");
    			var left = 0;
    			//自动执行持续性回调
    			requestAnimationFrame(step);
    			//持续该改变元素位置
    			function step() {
    				if(left < window.innerWidth - 200) {
    					left += 1;
    					elem.style.marginLeft = left + "px";
    					requestAnimationFrame(step);
    				}
    			}
    		</script>
    	</body>
    
    </html>
    
    • 效果图:以上代码可以直接运行,各位自行编译即可。

    Canvas动画

    canvas作为H5新增元素,是借助Web API来实现动画的。

    • 示例:
    <!DOCTYPE html>
    <html lang="en">
    
    	<head>
    		<meta charset="UTF-8">
    		<title>Document</title>
    		<style>
    			* {
    				margin: 0;
    				padding: 0;
    			}
    		</style>
    	</head>
    
    	<body>
    		<canvas id="canvas" width="700" height="550"></canvas>
    		<script type="text/javascript">
    			var canvas = document.getElementById("canvas");
    			var ctx = canvas.getContext("2d");
    			var left = 0;
    			var timer = setInterval(function() {
    				ctx.clearRect(0, 0, 700, 550);
    				ctx.beginPath();
    				ctx.fillStyle = "#ccc";
    				ctx.fillRect(left, 0, 100, 100);
    				ctx.stroke();
    				if(left > 700) {
    					clearInterval(timer);
    				}
    				left += 1;
    			}, 16);
    		</script>
    	</body>
    
    </html>
    
    • 效果图:以上代码可以直接运行,各位自行编译即可。
    展开全文
  • 最近项目用到文本滚动通知效果,首先想到了跑马灯可是限制太多不适用,就自己写了三实现方式,本篇来介绍第一滚动方式。1.通过scrollTo()方法来实现。这个方法原理是,需要一个承载TextView的父控件,我这里用到...

    最近项目用到文本滚动通知效果,首先想到了跑马灯可是限制太多不适用,就自己写了两种实现方式,本篇来介绍第一种滚动方式。


    1.通过scrollTo()方法来实现。

    这个方法原理是,需要一个承载TextView的父控件,我这里用到得是一个自定义RelativeLayout,在里面添加一个TextView。通过父控件RelativeLayout的不断scrollTo()方法,来实现TextView滚动效果。
    重写自定义RelativeLayout的onDraw方法,在onDraw调用scrollTo滑动效果会比较流畅,下面是代码。

        /**
         * 自定义RelativeLayout构造方法,把textview加入布局中
         * @param context
         * @param width
         * @param height
         */
        public PlayNotifyInnerWindow(Context context) {
            super(context);
            mContext = context;
            // TODO Auto-generated constructor stub
            this.setLayoutParams(newLayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));//设置大小
    
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.paly_notiry_text, null);
            tv = (TextView) view.findViewById(R.id.tv_notif);
            this.addView(view);//添加文本
        }

    下面是文本样式设置:

                if (!"".equals(left)) {
                    // layoutParams.leftMargin=Integer.parseInt(left);
                    layoutParams.setMargins(Integer.parseInt(left),0, 0, 0);//设置边距
                }
                if (!"".equals(right)) {
                    layoutParams.setMargins(0, 0, Integer.parseInt(right), 0);//设置边距
                }
    
                if (!"".equals(left) && !"".equals(right)) {
                    layoutParams.setMargins(Integer.parseInt(left), 0,//设置边距
                            Integer.parseInt(right), 0);
                }
                if (!"".equals(bottom)) {
                    layoutParams.topMargin = Integer.parseInt(bottom);//设置边距
                } else {
                    layoutParams.topMargin = 0;
                }
                msp = new SpannableString(content);
                if (isB == true) {//是否加粗
    
                    tv.getPaint().setFakeBoldText(true);
                } else {
                    tv.getPaint().setFakeBoldText(false);
                }
    
                if (isI == true) {//是否斜体
                    tv.getPaint().setTextSkewX(-0.5f);
                } else {
                    tv.getPaint().setTextSkewX(0f);
                }
                if (isU == true) {//是否有下划线
                    tv.getPaint().setUnderlineText(true);
                } else {
                    tv.getPaint().setUnderlineText(false);
    
                }
                //播放速度
                if (mspeed != null && !"".equals(mspeed)) {
                    speed = Integer.parseInt(mspeed);
                } else {
                    speed = 5;
                }
                //循环次数
                if (cicrle != null && !"".equals(cicrle)) {
                    cicle = Integer.parseInt(cicrle);
                } else {
                    cicle = 10000;
                }
                //背景颜色
                if (bgColor != 0 && isTran == false) {
    
                    this.setBackgroundColor(bgColor);
                } else {
                    this.setBackgroundColor(Color.TRANSPARENT);
                }
                if (bgZiti != 0) {
                    // 设置字体前景色
                    msp.setSpan(new ForegroundColorSpan(bgZiti), 0,
                            content.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置前景色为洋红色
    
                } else {
                    msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 0,
                            content.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
    
                }
                //字体大小
                if (!"".equals(zihao)) {
                    fontSize = Util.px2sp(mContext,
                            Util.sp2px(mContext, Integer.parseInt(zihao)) * rate);
                    tv.setTextSize(fontSize);
                } else {
                    fontSize = Util
                            .px2sp(mContext, Util.sp2px(mContext, 24) * rate);
                    tv.setTextSize(fontSize);
                }
                if (!"".equals(ziti)) {
                    Typeface tf = Util.choiceTypeface(ziti);
                    tv.setTypeface(tf);// 设置字体
    
                } else {
                    msp.setSpan(new TypefaceSpan("monospace"), 0, content.length(),
                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                //设置文本,可设置有样式文本
                tv.setText(msp);
                //自定义文字样式,立体,悬浮,碑刻,套色
                FontEffects mFontEffects = new FontEffects(tv, null);
                mFontEffects.setFontEffects(effect);
                i = 0;//循环次数标志位
    
                this.startScroll();//开始滚动
    // 开始滚动
            public void startScroll() {
                this.setVisibility(View.VISIBLE);
                isStop = false;
                invalidate();//重新绘制(执行onDraw)
            }
    
    @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            if (!isStop) {
                currentScrollX -= speed;// 滚动速度
                scrollTo(currentScrollX, 0);
                if (getScrollX() <= -(this.getWidth())) {// 如果滚动位置大于控件宽度说明已经滚动出去
                    currentScrollX = textWidth;// 初始化位置
                    // return;
                    if (i >= cicle - 1) {// 判断是否到达循环次数
                        // reach max times
                        stopScroll();
                        // return;
                    } else {
                        i++;
                    }
                }
                invalidate();
            }
        }
    
    //停止滚动
    public void stopScroll() {
            isStop = true;
            this.setVisibility(View.GONE);
            // scrollTo(0, 0);
        }
    

    以上就是第一种方法的实现,这种方法单独滚动没有问题,但是我们这个项目有很多动画是自定义控件重写OnDraw所以会有动画冲突,出现卡顿现象。所以有了后面两种方法。

    展开全文
  • 实现Activity跳转动画的五种方式

    千次阅读 2017-12-18 11:26:20
    这里总结了一下,种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式。 在介绍activity的切换动画之前我们先来说明一下实现切换activity的两种方式: ...

    文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式。

    在介绍activity的切换动画之前我们先来说明一下实现切换activity的两种方式:

    • 调用startActivity方法启动一个新的Activity并跳转其页面

    • 调用finish方法销毁当前的Activity返回上一个Activity界面

    当调用startActivity方法的时候启动一个新的activity,这时候就涉及到了旧的Activity的退出动画和新的Activity的显示动画; 
    当调用finish方法的时候,销毁当前Acitivity,就涉及到了当前Activity的退出动画和前一个Activity的显示动画;

    所以我们的activity跳转动画是分为两个部分的:一个Activity的销毁动画与一个Activity的显示动画,明白了这一点之后我们开始看一下第一种实现Activity跳转动画的方式:通过overridePendingTransition方法实现Activity切换动画。

    (一)使用overridePendingTransition方法实现Activity跳转动画

    overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。下面我们就将通过一个简单的例子看一下如何通过overridePendingTransition方法实现Activity的切换动画。

    demo例子中我们实现了Activity a中有一个点击按钮,点击按钮实现跳转Activity b的逻辑,具体代码如下:

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 在调用了startActivity方法之后立即调用overridePendingTransition方法
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    可以看到我们在调用了startActivity方法之后又执行了overridePendingTransition方法,而在overridePendingTransition方法中传递了两个动画布局文件,我们首先看一下这里的动画文件具体是怎么实现的:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:shareInterpolator="false"
        Android:zAdjustment="top">
        <translate
            Android:duration="200"
            Android:fromXDelta="-100.0%p"
            Android:toXDelta="0.0" />
    </set>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里的overridePendingTransition方法传递的是两个动画文件id,第一个参数是需要打开的Activity进入时的动画,第二个参数是需要关闭的Activity离开时的动画。这样我们执行了这段代码之后在跳转Activity的时候就展示了动画效果: 
    这里写图片描述

    动画的效果是通过overridePendingTransition方法实现的,那么下面我们来看一下overridePendingTransition方法的定义,我们在overridependingTransition方法在定义的时候有这样的一段注释说明:

    /**
     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
     * or {@link #finish} to specify an explicit transition animation to
     * perform next.
     */
    
    /**
     * @param enterAnim A resource ID of the animation resource to use for
     * the incoming activity.  Use 0 for no animation.
     * @param exitAnim A resource ID of the animation resource to use for
     * the outgoing activity.  Use 0 for no animation.
     */
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    好吧,这段注释,告诉通过注释我们能够知道:

    • overridePendingTransition方法需要在startAtivity方法或者是finish方法调用之后立即执行

    • 参数enterAnim表示的是从Activity a跳转到Activity b,进入b时的动画效果

    • 参数exitAnim表示的是从Activity a跳转到Activity b,离开a时的动过效果

    • 若进入b或者是离开a时不需要动画效果,则可以传值为0

    好吧,本着批判的精神,我们来看一下是不是这样的,首先看一下如果我们在startActivity方法调用之后不立即执行overridePendingTransition方法,会有动画效果么?

    若我们将overridePendingTransition延时1s执行呢?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 延时1s执行overridePendingTransition方法
                     */
                    button1.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_top, R.anim.slide_in_top);
                        }
                    }, 1000);
    
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    好吧,执行之后我们能够发现跳转动画没有了,所以overridePendingTransition只能在startActivity或者是finish方法之后执行。

    还有一个问题,如果是在startActivity之后执行,只是在子线程中执行呢?activity的跳转动画能够执行么?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 在子线程中执行overridePendingTransition方法
                     */
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                        }
                    }).start();
    
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    好吧,你没有猜错,activity的切换效果还是执行,也就是说overridePendingTransition方法也是可以在子线程中执行的,当然这并没什么卵用。

    好吧,在介绍完了使用overridePendingTransition方法实现Activity切换动画之后我们下面看一下使用style的方式定义实现Activity的切换动画。

    (二)使用style的方式定义Activity的切换动画

    (1)定义Application的style

    <!-- 系统Application定义 -->
    <application
            Android:allowBackup="true"
            Android:icon="@mipmap/ic_launcher"
            Android:label="@string/app_name"
            Android:supportsRtl="true"
            Android:theme="@style/AppTheme">
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (2)定义具体的AppTheme样式

    其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="Android:windowAnimationStyle">@style/activityAnim</item>
        </style>
    
    
    <!-- 使用style方式定义activity切换动画 -->
        <style name="activityAnim">
            <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
            <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item>
        </style>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    而在windowAnimationStyle中存在四种动画:

    activityOpenEnterAnimation // 用于设置打开新的Activity并进入新的Activity展示的动画
    activityOpenExitAnimation  // 用于设置打开新的Activity并销毁之前的Activity展示的动画
    activityCloseEnterAnimation  // 用于设置关闭当前Activity进入上一个Activity展示的动画
    activityCloseExitAnimation  // 用于设置关闭当前Activity时展示的动画
     
    • 1
    • 2
    • 3
    • 4

    (3)测试代码,实现activity切换操作

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过定义style的方式实现activity的跳转动画
             */
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 普通的Intent跳转Activity实现
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这时候我们我们执行diamante逻辑之后就能发现activity在切换的时候出现了动画效果,说明我们设置的style起作用了。

    (三)使用ActivityOptions切换动画实现Activity跳转动画

    上面我们讲解的通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但是MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。

    (1)在跳转的Activity中设置contentFeature

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 设置contentFeature,可使用切换动画
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
            Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
            getWindow().setEnterTransition(explode);
    
            setContentView(R.layout.activity_three);
        }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里我们在Activity的setContentView之前调用了:

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
     
    • 1

    方法,看过我的Activity布局加载流程的同学应该知道,这里的setFeature就是为activity的窗口设置特性,不同的特性对应不同的布局方式,比如可以设置无toolbar模式,有toolbar模式等等。而这里设置的是需要过渡动画,并且我们获取了Android中内置的explode动画,并设值给了Activity的window窗口对象,这样当Activity被启动的时候就会执行explode所带便的动画效果了。

    (2)在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上代码的方式实现activity的跳转动画
             */
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里我们调用了startActivity的重载方法:

    public void startActivity(Intent intent, @Nullable Bundle options)
     
    • 1

    并且我们传入了ActivityOptions.makeSceneTransitionAnimation,该方法表示将Activity a平滑的切换到Activity b,其还有几个重载方法可以指定相关的View,即以View为焦点平滑的从Activity a切换到Activity b。

    调用这段代码之后我们activity跳转的时候就展示出了动画效果。 
    这里写图片描述

    (四)使用ActivityOptions之后内置的动画效果通过style的方式

    这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:

    (1)编写过度动画文件

    <explode xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="300" />
     
    • 1
    • 2

    首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。

    (2)定义style文件

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
    
            <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
        </style>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在Application的style文件中添加:

    <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
     
    • 1
    • 2

    并指定过渡动画效果为我们刚刚定义的过渡动画文件。

    (3)执行跳转逻辑

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上style的方式实现activity的跳转动画
             */
            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画
                     */
                    Intent intent = new Intent(MainActivity.this, FourActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这样执行之后也可以展示出Activity跳转过度动画了,其和通过代码方式实现的效果是类似的,而且这种动画效果是全局的。

    (五)使用ActivityOptions动画共享组件的方式实现跳转Activity动画

    这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?

    (1)定义共享组件

    在Activity a中的button按钮点击transitionName属性:

    <Button
            Android:id="@+id/button5"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/button4"
            Android:layout_marginTop="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            Android:text="组件过度动画"
            Android:background="@color/colorPrimary"
            Android:transitionName="shareNames"
            />
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/activity_second"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_horizontal"
        Android:orientation="vertical"
        Android:transitionName="shareNames"
        >
    
        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/colorAccent"
            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            />
    
    
    </LinearLayout>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    (2)调用startActivity执行跳转动画

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
             */
            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, FiveActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。

    这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。 
    这里写图片描述

    总结:

    • 本文主要讲解了通过overridePendingTransition方式和ActivityOptions动画API实现Activity的切换动画效果;

    • overridePendingTransition方法从Android2.0开始,基本上能够覆盖我们activity跳转动画的需求;

    • ActivityOptions API是在Android5.0开始的,可以实现一些炫酷的动画效果,更加符合MD风格;

    • ActivityOptions还可以实现两个Activity组件之间的过度动画;

    • 本项目例子已上传待github中,欢迎star和follow,项目地址:实现activity跳转动画的五种方式

    展开全文
  • 文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的...这里总结了一下,种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式

    转载请标明出处:一片枫叶的专栏

    上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式。在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight()方法获取组件的宽度和高度其结果都是0,为什么会出现这个问题呢?

    其实看过我以前写过的Activity启动流程  Activity布局加载流程  Activity布局绘制流程  的同学应该对Activity的启动流程和其布局加载绘制流程不陌生,Activity的启动流程和Activity的布局文件加载绘制流程,其实没有相关的关系的,其实两个异步的加载流程,这样我们在Activity的onCreate或者是onResume方法中调用textView.getHeight()或者是textView.getWidth()方法的时候,Activity对应的组件并没有执行完绘制流程,因此此时获取到的组件的宽高都是默认的0,所以这时候通过getWidth()和getHeight()方法也就是无法获取组件的宽和高了。

    更多关于在Activity启动过程中获取组件宽高的知识,可参考我的:Activity启动过程中获取组件宽高的N种方式

    文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式。

    在介绍activity的切换动画之前我们先来说明一下实现切换activity的两种方式:

    • 调用startActivity方法启动一个新的Activity并跳转其页面

    • 调用finish方法销毁当前的Activity返回上一个Activity界面

    当调用startActivity方法的时候启动一个新的activity,这时候就涉及到了旧的Activity的退出动画和新的Activity的显示动画;
    当调用finish方法的时候,销毁当前Acitivity,就涉及到了当前Activity的退出动画和前一个Activity的显示动画;

    所以我们的activity跳转动画是分为两个部分的:一个Activity的销毁动画与一个Activity的显示动画,明白了这一点之后我们开始看一下第一种实现Activity跳转动画的方式:通过overridePendingTransition方法实现Activity切换动画。

    (一)使用overridePendingTransition方法实现Activity跳转动画

    overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。下面我们就将通过一个简单的例子看一下如何通过overridePendingTransition方法实现Activity的切换动画。

    demo例子中我们实现了Activity a中有一个点击按钮,点击按钮实现跳转Activity b的逻辑,具体代码如下:

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 在调用了startActivity方法之后立即调用overridePendingTransition方法
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
                }
            });

    可以看到我们在调用了startActivity方法之后又执行了overridePendingTransition方法,而在overridePendingTransition方法中传递了两个动画布局文件,我们首先看一下这里的动画文件具体是怎么实现的:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:shareInterpolator="false"
        Android:zAdjustment="top">
        <translate
            Android:duration="200"
            Android:fromXDelta="-100.0%p"
            Android:toXDelta="0.0" />
    </set>

    这里的overridePendingTransition方法传递的是两个动画文件id,第一个参数是需要打开的Activity进入时的动画,第二个参数是需要关闭的Activity离开时的动画。这样我们执行了这段代码之后在跳转Activity的时候就展示了动画效果:
    这里写图片描述

    动画的效果是通过overridePendingTransition方法实现的,那么下面我们来看一下overridePendingTransition方法的定义,我们在overridependingTransition方法在定义的时候有这样的一段注释说明:

    /**
     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
     * or {@link #finish} to specify an explicit transition animation to
     * perform next.
     */
    
    /**
     * @param enterAnim A resource ID of the animation resource to use for
     * the incoming activity.  Use 0 for no animation.
     * @param exitAnim A resource ID of the animation resource to use for
     * the outgoing activity.  Use 0 for no animation.
     */

    好吧,这段注释,告诉通过注释我们能够知道:

    • overridePendingTransition方法需要在startAtivity方法或者是finish方法调用之后立即执行

    • 参数enterAnim表示的是从Activity a跳转到Activity b,进入b时的动画效果

    • 参数exitAnim表示的是从Activity a跳转到Activity b,离开a时的动过效果

    • 若进入b或者是离开a时不需要动画效果,则可以传值为0

    好吧,本着批判的精神,我们来看一下是不是这样的,首先看一下如果我们在startActivity方法调用之后不立即执行overridePendingTransition方法,会有动画效果么?

    若我们将overridePendingTransition延时1s执行呢?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 延时1s执行overridePendingTransition方法
                     */
                    button1.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_top, R.anim.slide_in_top);
                        }
                    }, 1000);
    
                }
            });

    好吧,执行之后我们能够发现跳转动画没有了,所以overridePendingTransition只能在startActivity或者是finish方法之后执行。

    还有一个问题,如果是在startActivity之后执行,只是在子线程中执行呢?activity的跳转动画能够执行么?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 在子线程中执行overridePendingTransition方法
                     */
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                        }
                    }).start();
    
                }
            });

    好吧,你没有猜错,activity的切换效果还是执行,也就是说overridePendingTransition方法也是可以在子线程中执行的,当然这并没什么卵用。

    好吧,在介绍完了使用overridePendingTransition方法实现Activity切换动画之后我们下面看一下使用style的方式定义实现Activity的切换动画。

    (二)使用style的方式定义Activity的切换动画

    (1)定义Application的style

    <!-- 系统Application定义 -->
    <application
            Android:allowBackup="true"
            Android:icon="@mipmap/ic_launcher"
            Android:label="@string/app_name"
            Android:supportsRtl="true"
            Android:theme="@style/AppTheme">

    (2)定义具体的AppTheme样式

    其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="Android:windowAnimationStyle">@style/activityAnim</item>
        </style>
    
    
    <!-- 使用style方式定义activity切换动画 -->
        <style name="activityAnim">
            <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
            <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item>
        </style>

    而在windowAnimationStyle中存在四种动画:

    activityOpenEnterAnimation // 用于设置打开新的Activity并进入新的Activity展示的动画
    activityOpenExitAnimation  // 用于设置打开新的Activity并销毁之前的Activity展示的动画
    activityCloseEnterAnimation  // 用于设置关闭当前Activity进入上一个Activity展示的动画
    activityCloseExitAnimation  // 用于设置关闭当前Activity时展示的动画

    (3)测试代码,实现activity切换操作

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过定义style的方式实现activity的跳转动画
             */
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 普通的Intent跳转Activity实现
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });

    这时候我们我们执行diamante逻辑之后就能发现activity在切换的时候出现了动画效果,说明我们设置的style起作用了。

    (三)使用ActivityOptions切换动画实现Activity跳转动画

    上面我们讲解的通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但是MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。

    (1)在跳转的Activity中设置contentFeature

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 设置contentFeature,可使用切换动画
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
            Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
            getWindow().setEnterTransition(explode);
    
            setContentView(R.layout.activity_three);
        }

    这里我们在Activity的setContentView之前调用了:

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

    方法,看过我的Activity布局加载流程的同学应该知道,这里的setFeature就是为activity的窗口设置特性,不同的特性对应不同的布局方式,比如可以设置无toolbar模式,有toolbar模式等等。而这里设置的是需要过渡动画,并且我们获取了Android中内置的explode动画,并设值给了Activity的window窗口对象,这样当Activity被启动的时候就会执行explode所带便的动画效果了。

    (2)在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上代码的方式实现activity的跳转动画
             */
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });

    这里我们调用了startActivity的重载方法:

    public void startActivity(Intent intent, @Nullable Bundle options)

    并且我们传入了ActivityOptions.makeSceneTransitionAnimation,该方法表示将Activity a平滑的切换到Activity b,其还有几个重载方法可以指定相关的View,即以View为焦点平滑的从Activity a切换到Activity b。

    调用这段代码之后我们activity跳转的时候就展示出了动画效果。
    这里写图片描述

    (四)使用ActivityOptions之后内置的动画效果通过style的方式

    这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:

    (1)编写过度动画文件

    <explode xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="300" />

    首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。

    (2)定义style文件

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
    
            <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
        </style>

    在Application的style文件中添加:

    <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>

    并指定过渡动画效果为我们刚刚定义的过渡动画文件。

    (3)执行跳转逻辑

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上style的方式实现activity的跳转动画
             */
            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画
                     */
                    Intent intent = new Intent(MainActivity.this, FourActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });

    这样执行之后也可以展示出Activity跳转过度动画了,其和通过代码方式实现的效果是类似的,而且这种动画效果是全局的。

    (五)使用ActivityOptions动画共享组件的方式实现跳转Activity动画

    这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?

    (1)定义共享组件

    在Activity a中的button按钮点击transitionName属性:

    <Button
            Android:id="@+id/button5"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/button4"
            Android:layout_marginTop="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            Android:text="组件过度动画"
            Android:background="@color/colorPrimary"
            Android:transitionName="shareNames"
            />

    在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/activity_second"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_horizontal"
        Android:orientation="vertical"
        Android:transitionName="shareNames"
        >
    
        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/colorAccent"
            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            />
    
    
    </LinearLayout>

    (2)调用startActivity执行跳转动画

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
             */
            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, FiveActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle());
                }
            });

    需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。

    这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。
    这里写图片描述

    总结:

    • 本文主要讲解了通过overridePendingTransition方式和ActivityOptions动画API实现Activity的切换动画效果;

    • overridePendingTransition方法从Android2.0开始,基本上能够覆盖我们activity跳转动画的需求;

    • ActivityOptions API是在Android5.0开始的,可以实现一些炫酷的动画效果,更加符合MD风格;

    • ActivityOptions还可以实现两个Activity组件之间的过度动画;

    • 本项目例子已上传待github中,欢迎star和follow,项目地址:实现activity跳转动画的五种方式


    另外对github项目,开源项目解析感兴趣的同学可以参考我的:
    Github项目解析(一)–>上传Android项目至github
    Github项目解析(二)–>将Android项目发布至JCenter代码库
    Github项目解析(三)–>Android内存泄露监测之leakcanary
    Github项目解析(四)–>动态更改TextView的字体大小
    Github项目解析(五)–>Android日志框架
    Github项目解析(六)–>自定义实现ButterKnife框架
    Github项目解析(七)–>防止按钮重复点击
    Github项目解析(八)–>Activity启动过程中获取组件宽高的五种方式

    展开全文
  • Flash 文本特效动画制作软件,制作超过一百多种不同的文本特效和背景特效,可以完全自定义文字属性,包括字体、大小、颜色等等,使用 SWFText 完全不需要任何的 Flash 制作知识就可以轻松的做出专业的 Flash ...
  • 在HTML中插入SVG的几种方式

    万次阅读 2020-04-15 17:11:10
    SVG (Scalable Vector Graphics) 可缩放矢量图,是一基于XML语法的图像格式。其他图像格式都是基于像素处理的,SVG则是属于对图像的形状描述,所以它本质上是文本文件,体积相对较小,且放大时也不会失真。 插入...
  • Android实现滑动的几种方式

    千次阅读 2017-09-14 15:24:24
    前言 View的滑动对于View交互性及效果很大影响,我们可以通过5种方式来实现View的滑动,准确地说是View位置的改变。要改变View的位置,首先我们需要了解Android的坐标系,因为View的是通过坐标来定位的。绝对坐标...
  • 它提供了九高度可定制的动画类型来显示和消除文本,所有这些都基于对单个字符的操作。 动画包括: • 线性呈现,即:落入、飞出、滑入 • 爆炸 • 内爆 • 尾随文本,老式 Windows Solitaire Win Animation •...
  • 9网页动画常用实现方式总结

    千次阅读 2012-11-28 16:36:54
    目前来说,没有一种方式是完美的。 GIF兼容性最好,但是画质差,无交互。 Canvas很火热,功能也强大,编程难度也稍高,旧IE不支持。 SVG擅长处理矢量图形,交互容易,旧IE不支持。 CSS3很闪亮,但功能有限,旧IE...
  • 一款非常棒的 Flash 文本特效动画制作软件,可以制作超过一百多种不同的文本特效和背景特效,可以完全自定义文字属性,包括字体、大小、颜色等等,使用 SWFText 完全不需要任何的 Flash 制作知识就可以轻松的...
  • 作为一个前端初学者,在学习的时候可能会用到一些盒模型传统的布局方式(display + position + float),很多小伙伴用着用着就觉得这种传统布局写一些样式比较麻烦、不方便,比如垂直居中的传统实...
  • Android属性动画深入分析:让你成为动画牛人

    万次阅读 多人点赞 2014-01-04 18:29:20
    前言 感谢你阅读本文,我坚信读完本文肯定不会让你失望的。...关于动画,我已经写了两篇博文,但是还是没有将动画描述全面,于是我写了本文,另外,我后面还会再写一篇属性动画的源码分析,通过这四篇博文,
  • Android 三种动画详解

    千次阅读 2017-03-02 10:13:07
    不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统...
  • 互联网广告表现形式几种

    千次阅读 2019-06-20 09:50:49
    随着互联网技术的发展,互联网广告已成为企业推广的重要途径,那么互联网广告的形式又哪些?我们一起来看看! 1、网幅广告(Banner) 网幅广告是最早的互联网广告形式。它是以GIF,JPG,Flash等格式创建的图像文件,...
  • jquery中几种类型的选择器?

    千次阅读 2020-01-07 17:46:11
    jQuery 是一个简洁而快速的 JavaScript 库,可用于简化事件处理,HTML 文档遍历,Ajax 交互和动画,以便快速开发网站。jQuery 简化了 HTML 的客户端脚本,从而简化了 Web 2.0 应用程序的开发。 jQuery选择器 一...
  • 前言因为工作中有用到,所以我抽出空闲把之前的LinkageAnimation优化了一下,如果类似的需求(比如场景中大量的物体,都按照同一频率在运动),那么这个工具可能适合你,当然如果你的环境是2017,TimeLine会是一...
  • Kotlin入门(20)几种常见的对话框

    千次阅读 2018-09-27 22:58:55
    手机上的App极大地方便了人们的生活,很多业务只需用户拇指一点即可轻松办理,然而这也带来了一定的风险,因为时候用户并非真的想这么做,只是不小心点了一下而已,如果App不做任何提示的话,继续吭哧吭哧兀自办完...
  • 【Unity】骨骼动画如何优化资源

    千次阅读 2017-04-24 17:53:12
    为了优化动画文件大小,我们可以先分析下文件,Ctrl+D将动画文件从FBX拷贝出来,文本打开,如下图: 可以发现,动画文件基本上都是关键帧数据,分析后我们可以以下的优化方法。 1,减少骨骼: 我们知道一个...
  • 在前文 中,我详细的阐述了如何撸出一个酷炫的Path动画View,我们的口号是:I have a path.I have a view. Oh~,Path(Anim)View. 本文的目标是:I have a pic.I ...从此酷炫Path动画,你找到的图多精彩,gif就多精彩
  • 通过示例了解Vue过渡和动画

    千次阅读 多人点赞 2021-05-24 08:18:52
    作者:Matt Maribojoc 译者:前端小智 来源:stackabuse 梦想,干货,微信搜索 【大迁世界】 关注这个在凌晨... 幸运的是,对于开发人员而言,Vue动画只需分钟即可完成设置。 文本主要介绍 Vue <transition.
  • 上一篇主要讲了H.264,接下来我们看一下其他编解码标准。...参看:目前主流的几种数字视频压缩编解码标准 参看:视频编码标准汇总及比较 参看:An explanation of video compression techniques JPEG ...
  • Android实用视图动画及工具系列之三:表情加载动画和失败加载动画,人物加载动画,自定义有趣的动画载入视图,适用于各种网络及数据库数据载入显示,主要实现了载入动画和载入失败动画效果,主要功能原理利用了...
  • Android实现滑动的几种方法

    万次阅读 多人点赞 2016-06-13 15:17:17
    下面通过一个例子来总结实现滑动的几种方式,例子的主要功能就是让我们的自定义View能够随着手指的移动而移动。 布局文件如下: android:orientation="vertical" android:layout_width
  • 但是了这款软件,你就是专业的动画设计师了,不需要任何技术,会打字就行,只需要操作步,完美的动画swf文件就给你制作好了,专业,美观,漂亮...没有什么好说的,反正就是好!!!这款软件是动画爱好者,网站...
  • QLineEdit 文本输入

    千次阅读 2019-04-23 15:41:23
    按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右对齐 Qt.AlignCenter:水平方向居中对齐 Qt.AlignJustify:水平方向调整间距两端对齐 Qt.AlignTop:垂直方向靠上对齐 Qt....
  •  无缝衔接的角色动画是确保游戏代入感的重要因素,为了能帮助开发者创造出最逼真的动画角色,我们盘点了十二种动画制作工具。如果您其它优秀的工具推荐,请告诉我们,我们会进一步完善这份列表。  一、Morpheme...
  • Android 属性动画详解

    千次阅读 2019-01-09 18:49:59
    引言:  现在市面类似功能的App太多,如果你想要在类似的App中脱颖而出的话,那么你就要在增强用户体验方面... 先简单介绍一下Android中的几种动画,大致可分为三种:  1.补间动画(也叫视图动画、Tween动画...
  • Android应用开发之所有动画使用详解

    万次阅读 多人点赞 2015-08-09 10:15:20
    题外话:段时间没有更新博客了,这篇文章也是之前写了一半一直放在草稿箱,今天抽空把剩余的补上的。消失的这段时间真的好忙,节奏一下子有些适应不过来,早晨七点四十就得醒来,晚上九点四十才准备下班,好像最近...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,655
精华内容 21,462
关键字:

动画文本有几种方式