精华内容
下载资源
问答
  • 骨架屏是什么? 骨架屏(Skeleton Screen)是一种优化用户弱网体验方案。在弱网情况下,客户端获取到服务器数据时间会比较长,此时用户会比较烦躁。该方案是指在空白页面提供与原视图结构一致灰色区块链。某些...
  • Activity之间的动画切换首先什么是Transition? 安卓5.0中ActivityFragment变换建立在名叫Transitions安卓新特性之上。这个诞生于4.4transition框架为在不同UI状态之间产生动画效果提供了非常方便API...

    Activity之间的动画切换

    首先什么是Transition?

    安卓5.0中Activity和Fragment变换是建立在名叫Transitions的安卓新特性之上的。这个诞生于4.4的transition框架为在不同的UI状态之间产生动画效果提供了非常方便的API。该框架主要基于两个概念:场景(scenes)和变换(transitions)。场景(scenes)定义了当前的UI状态,变换(transitions)则定义了在不同场景之间动画变化的过程。虽然transition翻译为变换似乎很确切,但是总觉得还是没有直接使用transition直观,为了更好的理解下面个别地方直接用transition代表变换。

    当一个场景改变的时候,transition主要负责:

    1)捕捉每个View在开始场景和结束场景时的状态。
    (2)根据两个场景(开始和结束)之间的区别创建一个Animator

    transition框架的两个主要优点。第一、Transitions抽象和封装了属性动画,Animator的概念对开发者来说是透明的,因此它极大 的精简了代码量。开发者所做的所有事情只是改变一下view前后的状态数据,Transition就会自动的根据状态的区别去生成动画效果。第二、不同场 景之间变换的动画效果可以简单的通过使用不同的Transition类来改变。一般的transition有explode,fade,slide。

    在开始讲解之前我们先做一些约定,虽然下面的约定是针对activity的,但是在Fragment中也是一样的约定。
    AB表示两个Activity,现在假设A跳转B。这里的进入和退出一个有两种方式。
    Activity transition API围绕退出(exit),进入(enter),返回(return)和再次进入(reenter)四种transition。按照上面对A和B的约定,我这样描述这一过程。

    Activity A的退出变换(exit transition)决定了在A调用B的时候,A中的View是如何播放动画的。
    Activity B的进入变换(enter transition)决定了在A调用B的时候,B中的View是如何播放动画的。
    Activity B的返回变换(return transition)决定了在B返回A的时候,B中的View是如何播放动画的。
    Activity A的再次进入变换(reenter transition)决定了在B返回A的时候,A中的View是如何播放动画的。

    具体的使用步骤:
    1.在调用与被调用的activity中,通过设定Window.FEATURE_ACTIVITY_TRANSITIONS 和 Window.FEATURE_CONTENT_TRANSITIONS 来启用transition api ,可以通过代码也可以通过设置主题来启用:
    A.代码方式,在setContentView之前调用:
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    B.主题xml
    item name=”android:windowContentTransitions”>true

    2.分别在调用与被调用的activity中设置exit 和enter transition。Material主题默认会将exit的transition设置成null而enter的transition设 置成Fade .如果reenter 或者 return transition没有明确设置,则将用exit 和enter的transition替代。

                getWindow().setExitTransition(explode);
                getWindow().setEnterTransition(explode);
    

    开始一个activity的content transaction需要调用startActivity(Context, Bundle)方法,将下面的bundle作为第二个参数:
    只是单纯的slide或者fade效果以及只有一个view元素共享,
    Bundle=ActivityOptions.makeSceneTransitionAnimation(this).toBundle();
    Bundle= ActivityOptions.makeSceneTransitionAnimation(this, view, “transitionName”).toBundle());
    但是如果是多个view进行元素共享,用pari更方便
    Pari:import android.support.v4.util.Pair;
    //比如三个view同时设置共享元素

    Pair first=new Pair<>(small, ViewCompat.getTransitionName(small));
    Pair second=new Pair<>(small1, ViewCompat.getTransitionName(small1));
    Pair thid=new Pair<>(small2, ViewCompat.getTransitionName(small2));
    ActivityOptionsCompat optionsMore = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, first,second,thid);

    熟悉基本的步骤后下面整理几个学习的demo
    1.explode|slide|fade

    explode:

    final Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.explode);
       /*
      退出时使用
       */
      getWindow().setExitTransition(explode);
       /*
       第一次进入时使用
       */
      getWindow().setEnterTransition(explode);
      /*
       再次进入时使用
       */
     getWindow().setReenterTransition(explode);
     startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
    

    这里写图片描述
    fade:

     final Transition fade = TransitionInflater.from(this).inflateTransition(R.transition.fade);
    
     findViewById(R.id.fade).setOnClickListener(new View.OnClickListener() {
        @Override
      public void onClick(View v) {
       getWindow().setExitTransition(fade);
      getWindow().setEnterTransition(fade);
      getWindow().setReenterTransition(fade);
      startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
        }
    });
    
    

    这里写图片描述

    slide:

     final Transition slide= TransitionInflater.from(this).inflateTransition(R.transition.slide);
     findViewById(R.id.slide).setOnClickListener(new View.OnClickListener() {
        @Override
      public void onClick(View v) {
       getWindow().setExitTransition(slide);
      getWindow().setEnterTransition(slide);
      getWindow().setReenterTransition(slide);
      startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
        }
    });

    这里写图片描述

    元素共享:

      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            final Intent intent = new Intent(MainActivity.this, Main2Activity.class);
            small= (TextView) findViewById(R.id.small);
            small1= (TextView) findViewById(R.id.small1);
            small2= (TextView) findViewById(R.id.small2);
    
    
    
            //多个view同时分享元素,就要用到pari
    
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
          Pair first=new Pair<>(small, ViewCompat.getTransitionName(small));
          Pair second=new Pair<>(small1, ViewCompat.getTransitionName(small1));
          Pair thid=new Pair<>(small2, ViewCompat.getTransitionName(small2));
          ActivityOptionsCompat optionsMore = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, first,second,thid);
                    startActivity(intent,optionsMore.toBundle());
                }
            });
        }

    这里写图片描述

    这里注意,这个时候使用的不是ActivityOptions而是ActivityOptionsCompat

    这里写共享元素的时候出现两个问题:
    第一个:
    这里写图片描述
    这个是由于所有的TransitionName设置的值都是一样的,感觉起来第二只有
    第二个问题:
    这里写图片描述

    我打印了Activity1中的log,发现控件的可见值发生了变化,但是具体原因我不清楚….还在找:

        是否可见----第一个8  第二个8   第三个0
        是否可见----第一个4  第二个0   第三个0

    以上,我们都是主要在Activity1中设置动画,还有一个问题就是假设不在点击事件中进行startActivity,就会有一个异常,这个问题我也在找….(好多问题还不清楚…..还在学习…..).
    这里写图片描述
    这个效果,是不是感觉像侧滑菜单,这个就是直接在Activity2中调用setupWindowAnimations即可

     private void setupWindowAnimations() {
            Transition fade = TransitionInflater.from(this).inflateTransition(R.transition.slide);
            getWindow().setReturnTransition(fade);//返回上一个activity 时本activity的效果
            getWindow().setEnterTransition(fade);//进入本activity时本activity的效果
        }

    以上,就是现在的一个学习整理,还有好多不清楚的地方还在查找学习,加油~

    参考数据:
    https://github.com/lgvalle/Material-Animations/blob/master/README.md
    http://www.jianshu.com/p/1b5212d84a15
    http://blog.csdn.net/u013675234/article/details/50472282
    http://blog.csdn.net/huachao1001/article/details/51659963
    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0201/2394.html
    http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0113/2310.html

    展开全文
  • 枸杞由来技术栈

    2021-01-02 15:11:32
    <p>TypeScript 还极具创新地引入了 <code>Language as Sever</code> 的特性(Rust 最近也把这个功能抄了过去)。什么意思呢?就是只要 <code>tsserver</code> 这个模块启动,就可以享受到...
  • 安卓5.0中ActivityFragment 变换建立在名叫Transitions安卓新特性之上。这个诞生于4.4transition框架为在不同UI状态之间产生动画效果提供了非常方便API。该框架主要基于两个概念:场景(scenes)...

    什么是Transition?

    安卓5.0中Activity和Fragment 变换是建立在名叫Transitions的安卓新特性之上的。这个诞生于4.4的transition框架为在不同的UI状态之间产生动画效果提供了非常方便的API。该框架主要基于两个概念:场景(scenes)变换(transitions)。场景(scenes)定义了当前的UI状态,变换(transitions)则定义了在不同场景之间动画变化的过程。虽然transition翻译为变换似乎很确切,但是总觉得还是没有直接使用transition直观,为了更好的理解下面个别地方直接用transition代表变换。

    当一个场景改变的时候,transition主要负责:

    (1)捕捉每个View在开始场景和结束场景时的状态。

    (2)根据两个场景(开始和结束)之间的区别创建一个Animator。


    考虑这样一个例子,当用户点击屏幕,让activity中的view逐渐消失。使用安卓的transition框架,我们只需几行代码就可完成,如下:

    1. public class ExampleActivity extends Activity implements View.OnClickListener {
    2.     private ViewGroup mRootView;
    3.     private View mRedBox, mGreenBox, mBlueBox, mBlackBox;
    4.     @Override
    5.     protected void onCreate(Bundle savedInstanceState) {
    6.         super.onCreate(savedInstanceState);
    7.         setContentView(R.layout.activity_main);
    8.         mRootView = (ViewGroup) findViewById(R.id.layout_root_view);
    9.         mRootView.setOnClickListener(this);
    10.         mRedBox = findViewById(R.id.red_box);
    11.         mGreenBox = findViewById(R.id.green_box);
    12.         mBlueBox = findViewById(R.id.blue_box);
    13.         mBlackBox = findViewById(R.id.black_box);
    14.     }
    15.     @Override
    16.     public void onClick(View v) {
    17.         TransitionManager.beginDelayedTransition(mRootView, new Fade());
    18.         toggleVisibility(mRedBox, mGreenBox, mBlueBox, mBlackBox);
    19.     }
    20.     private static void toggleVisibility(View... views) {
    21.         for (View view : views) {
    22.             boolean isVisible = view.getVisibility() == View.VISIBLE;
    23.             view.setVisibility(isVisible ? View.INVISIBLE : View.VISIBLE);
    24.         }
    25.     }
    26. }

    为了更好的理解幕后发生的事情,让我们来一步一步的分析,假设最开始每个view都是可见的:

    (1)当点击事件发生之后调用TransitionManager的beginDelayedTransition()方法,并且传递了mRootView和一个Fade对象最为参数。之后,framework会立即调用transition类的captureStartValues()方法为每个view保存其当前的可见状态(visibility)。

    (2)当beginDelayedTransition返回之后,在上面的代码中将每个view设置为不可见。

    (3)在接下来的显示中framework会调用transition类的captureEndValues()方法,记录每个view最新的可见状态。

    (4)接着,framework调用transition的createAnimator()方法。transition会分析每个view的开始和结束时的数据发现view在开始时是可见的,结束时是不可见的。Fade(transition的子类)会利用这些信息创建一个用于把view的alpha属性变为0的AnimatorSet,并且将此AnimatorSet对象返回。

    (5)framework会运行返回的Animator,导致所有的View都渐渐消失。


    编者注:读者可以在这里回想假如不使用transition框架,我们自己使用属性动画(Animator)来实现是不是复杂很多,其实transition框架的作用就是封装了属性动画的操作。

    这个简单的例子强调了transition框架的两个主要优点。第一、Transitions抽象和封装了属性动画,Animator的概念对开发者来说是透明的,因此它极大的精简了代码量。开发者所做的所有事情只是改变一下view前后的状态数据,Transition就会自动的根据状态的区别去生成动画效果。第二、不同场景之间变换的动画效果可以简单的通过使用不同的Transition类来改变,本例中用的是Fade。

    6666445555111.gif

    实现上图中的那两个不同的动画效果可以将Fade替换成Slide或者Explode即可。在接下来的文章中你将会发现,这些优点将使得我们只用少量代码就可以创建复杂的Activity 和Fragment切换动画。在接下来的小节中,将看到是如何使用Lollipop的Activity 和Fragment transition API来实现这种变换的。

    5.0中的Activity和Fragment Transition

    Android 5.0中Transition可以被用来实现Activity或者Fragment切换时的异常复杂的动画效果。虽然在以前的版本中,已经可以使用Activity的overridePendingTransition() 和 FragmentTransaction的setCustomAnimation()来实现Activity或者Fragment的动画切换,但是他们仅仅局限与将整个视图一起动画变换。新的Lollipop api更进了一步,让单独的view也可以在进入或者退出其布局容器中时发生动画效果,甚至还可以在不同的activity/Fragment中共享一个view。

    在开始讲解之前我们先做一些约定,虽然下面的约定是针对activity的,但是在Fragment中也是一样的约定。

    A和B分别是两个Activity,假设activity A 调用activity B。将A代表调用Activity ,B代表被调用Activity。

    Activity transition API围绕退出(exit),进入(enter),返回(return)和再次进入(reenter)四种transition。按照上面对A和B的约定,我这样描述这一过程。

    Activity A的退出变换(exit transition)决定了在A调用B的时候,A中的View是如何播放动画的。

    Activity B的进入变换(enter transition)决定了在A调用B的时候,B中的View是如何播放动画的。

    Activity B的返回变换(return transition)决定了在B返回A的时候,B中的View是如何播放动画的。

    Activity A的再次进入变换(reenter transition)决定了在B返回A的时候,A中的View是如何播放动画的。

    最后framework提供了两种Activity transition- 内容transition和共享元素的transition:

    A content transition determines how an activity's non-shared views—called transitioning views—enter or exit the activity scene.

    A shared element transition determines how an activity's shared elements (also called hero views) are animated between two activities.

    上图中演示了Google Play Newsstand 应用的效果,虽然我们无法查看它的源码,但是我敢打赌它用了以下的transition:

    activity A 中exit和reenter transition是为null的,因为A中的非共享view在退出和再次进入的时候没有动画效果。

    activity B中的enter content transition使用了自定义的slide-in变换。该变换使B中list的元素从下到上过度。

    activity B中return content transition是一组TransitionSet,同时播放了两个子元素的变换:上半部分和下半部分的slide变换。看起来就像整个界面被从从中间分割成了两半。

    enter and return 共享元素变换是用了ChangeImageTransform。让两个activity中的ImageView无缝切换。

    你可能还注意到了在共享元素变换播放的同时还有个圆形水波效果的动画。我们将在以后的博客中讨论如何实现。目前为了是问题更简单,我们主要讨论熟悉的activity变换。

    Activity Transition API介绍

    用5.0的API创建一个基本的Activity transition是较为简单的。下面的总结是实现Activity transition的步骤。这篇文章主要是对Activity transition做简单的介绍,作为引入的篇章。在后续的文章中我们再介绍一些高级的用法。

    1.在调用与被调用的activity中,通过设定Window.FEATURE_ACTIVITY_TRANSITIONS  和Window.FEATURE_CONTENT_TRANSITIONS 来启用transition api ,可以通过代码也可以通过设置主题来启用:

    代码方式,在setContentView之前调用:

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

    主题xml

    1. <item name="android:windowContentTransitions">true</item>

    2.分别在调用与被调用的activity中设置exit 和enter transition。Material主题默认会将exit的transition设置成null而enter的transition设置成Fade .如果reenter 或者 return transition没有明确设置,则将用exit 和enter的transition替代。


    3.分别在调用与被调用的activity中设置exit 和enter 共享元素的transition。Material主题默认会将exit的共享元素transition设置成null而enter的共享元素transition设置成@android:transition/move.如果reenter 或者 return transition没有明确设置,则将用exit 和enter的共享元素transition替代。

    开始一个activity的content transaction需要调用startActivity(Context, Bundle)方法,将下面的bundle作为第二个参数:

    1. ActivityOptions.makeSceneTransitionAnimation(activity, pairs).toBundle();

    其中pairs参数是一个数组:Pair<View, String> ,该数组列出了你想在activity之间共享的view和view的名称。别忘了给你的共享元素加上一个唯一的名称,否则transition可能不会有正确的结果。

    4.在代码中触发通过finishAfterTransition()方法触发返回动画,而不是调用finish()方法。

    5.默认情况下,material主题的应用中enter/return的content transition会在exit/reenter的content transitions结束之前开始播放(只是稍微早于),这样会看起来更加连贯。如果你想明确屏蔽这种行为,可以调用setWindowAllowEnterTransitionOverlap() 和 setWindowAllowReturnTransitionOverlap()方法。


    Fragment Transition API介绍

    如果你想在Fragment中使用transition,除了一小部分区别之外和activity大体一致:


    1.Content的exit, enter, reenter, 和return transition需要调用fragment的相应方法来设置,或者通过fragment的xml属性来设置。

    2.共享元素的enter和return transition也n需要调用fragment的相应方法来设置,或者通过fragment的xml属性来设置。

    3.虽然在activity中transition是被startActivity()和finishAfterTransition()触发的,但是Fragment的transition却是在其被FragmentTransaction执行下列动作的时候自动发生的。added, removed, attached, detached, shown, ,hidden。

    4.在Fragment commit之前,共享元素需要通过调用addSharedElement(View, String) 方法来成为FragmentTransaction的一部分。

    总结

    在本文中,我们仅仅是对新的Activitiy 和Fragment transition API做了一个简单的介绍。但是在接下来的文章中你会看到对基础概念的掌握会让你以后学习的更快,尤其是当你要做一些自定义Transition的时候。后面的文章中我们将更深入的去理解content transition和hared element transition,同时对Activity 和Fragment transition的工作原理有更深的理解。

    最后,谢谢你的阅读,欢迎大家留言。


    本文翻译自:Getting Started with Activity & Fragment Transitions (part 1)  

    欢迎转载,但请保留本文链接   http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0113/2310.html 

    展开全文
  • csshtml常考面试题

    2019-08-02 21:47:01
    css3中过渡和动画的区别各自适用场景: 如何显示小于12px字体: 单行或多行文本溢出显示省略号,如何实现: 常见移动端布局解决方案有哪些;原理如何: 简述rem布局: 什么是less:有什么好处: css3有哪些新...
    css3中过渡和动画的区别和各自适用场景:
    如何显示小于12px的字体:
    单行或多行文本溢出显示省略号,如何实现:
    常见的移动端布局解决方案有哪些;原理如何:
    简述rem布局:
    什么是less:有什么好处:
    css3有哪些新特性:
    css3新增选择器有哪些:
    h5有哪些新特性、移除了哪些元素?如何处理html5新标签的浏览器兼容问题?
    在项目中你是如何做图片优化的?
    为什么要初始化css样式,那些样式需要初始化?
    你能想出几种方法让元素在页面消失?
    标签应该如何合理嵌套?
    用纯css代码实现小箭头思路?
    简述精灵图的原理及其优缺点?
    简述网页中常见的图片格式及特点?
    图片间隙问题,如何解决?
    常见浏览器的兼容问题?
    等高布局、圣杯布局、双飞翼布局的实现原理?
    如何让盒子水平垂直居中?
    简述bfc规则,及解决的问题?
    块级标签和行内标签的区别?
    浮动产生的原因?清除浮动的方案?
    选择器优先级如何计算?
    哪些css属性是可继承的?
    简述css盒模型?
    如何使用border实现小三角?
    margin外边距常见问题及解决方法?
    简述<!doctype>的作用?
    谈谈语义化的理解?
    五大浏览器及其内核?
    展开全文
  • 开始学习 PixiJS

    千次阅读 2018-11-26 20:47:39
    它拥有语义化的,简洁的API接口并且加入了一些非常有用的特性。比如支持纹理贴图集为精灵(交互式图像)提供了一个简单的动画系统。它也提供了一个完备的场景图,你可以在精灵图层里面创建另一个精灵,当然也可以...

    PixiJS 介绍

    PixiJS 是一个超快的2D渲染引擎。它自动侦测使用 WebGL 或者 Canvas。开发者无需专门学习 WebGL 就能感受到强大的硬件加速的力量。

    PixiJS 会帮助你用 JavaScript 或者其他 HTML5 技术来显示媒体,创建动画或管理交互式图像,从而制作一个游戏或应用。它拥有语义化的,简洁的 API 接口并且加入了一些非常有用的特性。比如支持纹理贴图集和为精灵(交互式图像)提供了一个简单的动画系统。它也提供了一个完备的场景图,你可以在精灵图层里面创建另一个精灵,当然也可以让精灵响应你的鼠标或触摸事件。

    要注意的是,虽然 PixiJS 非常适合制作游戏,但它并不是一个游戏引擎,它的核心本质是尽可能快速有效地在屏幕上移动物体。

    感受一下

    下面这些是用 PixiJS 实现的一些例子,你可以点开看看。

    cavalier challenge

    Run Pixie Run

    Filters Demo

    WASTE INVADERS

    Storm Brewing

    H5场景小动画

    打砖块游戏

    安装

    为了能很好的使用 PixiJS ,你需要在你项目的根目录运行一个 web 服务器,这里推荐使用 node.js 并且去用命令行安装 http-server,当然你也可以用其他的 web 服务器,比如
    ApacheNginx,总之你需要让你的项目在服务器环境下运行,也就是用 http://xxxxxx 这种方式来访问你的项目,而不是 file://xxxxxx ,如果直接在本地打开 HTML 文件有些时候是会出问题的,比如用 file://xxxxxx 的方式运行项目时,图片是跨域的,调用一些方法时,就会报错了。

    NPM 安装:

    $> npm install pixi.js
    

    CDN 安装:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script>
    

    你也可以直接去 Github 下载 js 文件。

    你可以用下面这样的代码,测试是否已经安装了PixiJS

    <!doctype html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Hello World</title>
    </head>
    	<script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <body>
      <script type="text/javascript">
        let type = "WebGL"
        if(!PIXI.utils.isWebGLSupported()){
          type = "canvas"
        }
    
        PIXI.utils.sayHello(type)
      </script>
    </body>
    </html>
    

    如果 PixiJS 安装成功,在浏览器的控制台中你会看见这样的东西。

    概念介绍

    PixiJS 中有些比较重要的概念是需要知道的。

    Pixi 应用
    使用 PixiJS ,我们首先应该创建一个 Pixi 应用,使用 PIXI.Application() 方法可以 new 一个,这个方法可以传入一个对象参数,这个对象中,可以设置 Pixi 应用的宽、高、是否透明,等一些属性,具体所有可以设置的属性可以到 Pixi 的文档里看

    在使用 PIXI.Application() 方法时,如果你没有给传入的参数对象设置 view 属性,它会自动创建一个canvas元素,创建出来的 canvas 元素就在 Pixi 应用的 view 属性中。

    // 创建一个Pixi 应用
    let app = new PIXI.Application({width: 256, height: 256});
    
    // 把 Pixi 应用中创建出来的 canvas 添加到页面上
    document.body.appendChild(app.view);
    

    容器
    容器是用来装载多个显示对象的, 它可以用 PIXI.Container() 方法来创建,而我们创建的 Pixi 应用的 stage 属性就是一个容器对象,它被当作根容器使用,它将包裹所有你想用 Pixi 显示的东西。

    精灵
    精灵是可以放在容器里的特殊图像对象。精灵是你能用代码控制图像的基础。你能够控制他们的位置,大小,和许多其他有用的属性来产生交互和动画。
    创建一个精灵需要用 PIXI.Sprite() 方法。

    纹理
    因为 Pixi 用 WebGL 和 GPU 去渲染图像,所以图像需要转化成 GPU 可以处理的格式。可以被 GPU 处理的图像被称作 纹理 。在你让精灵显示图片之前,需要将普通的图片转化成 WebGL 纹理。为了让所有工作执行的快速有效率,Pixi使用 纹理缓存 来存储和引用所有你的精灵需要的纹理。纹理的名称字符串就是图像的地址。这意味着如果你有从"images/cat.png" 加载的图像,你可以在纹理缓存中这样找到他:

    PIXI.utils.TextureCache["images/cat.png"];
    

    示例

    我们来看一个用 PixiJS 实现的让图片波浪化的效果

    效果图

    示例效果地址:

    https://www.kkkk1000.com/images/learnPixiJS/

    这个效果用到了 PixiJS 提供的一个滤镜 — DisplacementFilter(置换滤镜)

    置换滤镜就是选择另一幅图片,让其在当前的图片上产生凹凸效果。

    原图

    置换图

    用 置换滤镜 把 置换图 平铺 到 原图 上之后

    在这个效果中,是这样的
    原图
    在这里插入图片描述

    置换图
    在这里插入图片描述

    使用置换滤镜后
    在这里插入图片描述

    用置换滤镜让原图产生扭曲,通过不断的改变置换图的位置,使原图的扭曲不断的改变,看上去就像波浪了。

    完整代码

    <!DOCTYPE html>
    <html lang="zn">
    
    <head>
        <meta charset="UTF-8">
        <title>Pixi JS 置换滤镜效果</title>
        <style>
            .start-btn,
            .stop-btn {
                display: inline-block;
                color: #fff;
                border-radius: 4px;
                border: none;
                cursor: pointer;
                outline: none;
                padding: 10px 20px;
                margin-bottom: 30px;
            }
    
            .start-btn {
                background-color: #ff0081;
                box-shadow: 0 2px 25px rgba(255, 0, 130, 0.5);
            }
    
            .stop-btn {
                background-image: linear-gradient(to right, #4facfe 0%, #00f2fe 100%);
                margin-left: 20px;
                box-shadow: 0 2px 25px rgba(22, 217, 227, 0.5);
            }
        </style>
    </head>
    
    <body>
        <div>
            <button class="start-btn">开始</button>
            <button class="stop-btn">停止</button>
        </div>
        <div id="px-render"></div>
    
        <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
        <script>
            // 创建一个 Pixi应用 需要的一些参数
            var option = {
                width: 400,
                height: 300,
                transparent: true,
            }
    
            // 创建一个 Pixi应用
            var app = new PIXI.Application(option);
            // 获取渲染器
            var renderer = app.renderer;
            // 图片精灵
            var preview;
            // 置换图精灵
            var displacementSprite;
            // 滤镜
            var displacementFilter;
            // 舞台(一个容器),这里面包括了图片精灵、置换图精灵
            var stage;
            var playground = document.getElementById('px-render');
    
            function setScene(url) {
                // renderer.view 是 Pixi 创建的一个canvas
                // 把 Pixi 创建的 canvas 添加到页面上
                playground.appendChild(renderer.view);
    
                // 创建一个容器 
                stage = new PIXI.Container();
    
                // 根据图片的 url,创建图片精灵
                preview = PIXI.Sprite.fromImage(url);
    
                // 创建置换图精灵,在创建置换滤镜时会用到这个精灵 
                displacementSprite = PIXI.Sprite.fromImage('https://www.kkkk1000.com/images/learnPixiJS/sprite.png'); 
    
                // 设置置换图精灵为平铺模式
                displacementSprite.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT;
    
                // 创建一个置换滤镜
                displacementFilter = new PIXI.filters.DisplacementFilter(displacementSprite);
    
                // 添加 图片精灵 到舞台
                stage.addChild(preview);
    
                // 添加 置换图精灵 到舞台 
                stage.addChild(displacementSprite);
    
                // 把 stage 添加到根容器上
                app.stage.addChild(stage);
            }
    
    
            // 置换图精灵的移动速度
            var velocity = 1;
            // raf 是调用 requestAnimationFrame方法的返回值,停止动画效果时需要用到
            var raf;
            function animate() {
                raf = requestAnimationFrame(animate);
                // 改变置换图精灵的位置
                displacementSprite.x += velocity;
                displacementSprite.y += velocity;
            }
            setScene('https://www.kkkk1000.com/images/learnPixiJS/view.jpg');
    
    
            var start = document.querySelector('.start-btn');
            var stop = document.querySelector('.stop-btn');
            start.onclick = function () {
                // 设置舞台的滤镜
                stage.filters = [displacementFilter];
                // 开始动画
                animate();
            }
    
            stop.onclick = function () {
                // 取消滤镜
                stage.filters = [];
                // 停止动画
                cancelAnimationFrame(raf);
            }
        </script>
    </body>
    
    </html>
    

    总结

    因为最近在学习 PixiJS,所以想把学习的知识总结一下,这篇文章是简单的介绍了下 PixiJS,后续还会继续写一些关于 PixiJS 其他的东西。

    如果文中有错误的地方,还请小伙伴们指出,万分感谢。

    参考

    PixiJS 官网

    Pixi 中文教程

    PixiJS API 文档

    Pixi JS Displacement Effect

    展开全文
  • Android:Fragment Transition介绍

    千次阅读 2015-12-26 23:59:45
    安卓5.0中ActivityFragment 变换建立在名叫Transitions安卓新特性之上。这个诞生于4.4transition框架为在不同UI状态之间产生动画效果提供了非常方便API。该框架主要基于两个概念:场景(scenes)...
  • UE4 # 1 基础知识

    2020-10-12 12:33:48
    了解UE4渲染特性(灯光、后期雾) 制作简单UI界面、过场动画 什么是虚幻4? 虚幻4都有哪些功能? 虚幻4适合什么人学? 虚幻4支持平台? 虚幻4制作游戏 虚幻4学习之路 一些问题 ...
  • 它拥有语义化的,简洁的API接口并且加入了一些非常有用的特性。比如支持纹理贴图集为精灵(交互式图像)提供了一个简单的动画系统。它也提供了一个完备的场景图,你可以在精灵图层里面创建另一个精灵,当然也可以...
  • 80%前端会答错问题:是什么元素? 5种作为Web开发人员应避免CSS做法 响应式网页中高度设计,你认真吗? CSS垂直居中七个方法 使用网络构建复杂布局超实用技巧,赶紧收藏吧! 超越媒体查询:...
  • SSR也不错方案,但要考虑开发维护成本具体场景。 简单进度条/百分比,用户希望精确地知道什么时候能看到内容。 直接在性能上下狠手,缩小或消除LCP,FID,CLS等指标。 项目思考板块 20200318 研究结束,别...
  • Java典型模块

    2012-02-25 18:27:40
    5.2.3 做饭场景的类 5.2.4 修改后的妈妈类 5.3 知识点扩展——线程的状态 5.3.1 线程的创建状态 5.3.2 线程的暂停状态 5.3.3 线程的结束状态 5.4 小结 第6章 火车站售票系统(线程安全知识) 6.1 火车站售票系统原理...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    标记值:允许为模型元素添加新的特性带有相关值得关键字 JAVA开发平台体系结构 构架一个系统的组织结构包括: 1. 系统分解成的各个部分 2. 它们的连接性 3. 交互机制 4. 通知系统设计的向导规则 JAVA开发...
  • Web前端框架Angular.zip

    2019-07-16 03:27:51
    通过 Angular 中直观简便 API 创建高性能复杂编排和动画时间线 —— 只要非常少代码。 可访问性 通过支持 ARIA 组件、开发者指南内置一体化测试基础设施,创建具有完备可访问性...
  • 这允许您在编辑器中快速调整纹理,然后在游戏中使用完全相同的特性绘制它们。 ▶混合模式 你不局限于画普通的反照率纹理。3D绘画有一系列的混合模式设置,允许你画任何类型的纹理你喜欢。例如,添加混合照明纹理,...
  • 常见的25个典型模块4个完整的项目案例,详细介绍java语言的特性、线程开发、图形用户开发(gui)、文件i/o操作 、applet程序、网络编程等知识。 《java典型模块与项目实战大全》附带1张dvd光盘,内容为与本书配套...
  • 这允许您在编辑器中快速调整纹理,然后在游戏中使用完全相同的特性绘制它们。 ▶混合模式 你不局限于画普通的反照率纹理。3D绘画有一系列的混合模式设置,允许你画任何类型的纹理你喜欢。例如,添加混合照明纹理,...
  • 这允许您在编辑器中快速调整纹理,然后在游戏中使用完全相同的特性绘制它们。 ▶混合模式 你不局限于画普通的反照率纹理。3D绘画有一系列的混合模式设置,允许你画任何类型的纹理你喜欢。例如,添加混合照明纹理,...
  • 《java典型模块与项目实战大全》以实战开发为原则,以java热门开发技术与项目案例开发为主线,通过java开发中最常见的25个典型模块4个完整的项目案例,详细介绍java语言的特性、线程开发、图形用户开发(gui)、...
  • 《java典型模块与项目实战大全》以实战开发为原则,以java热门开发技术与项目案例开发为主线,通过java开发中最常见的25个典型模块4个完整的项目案例,详细介绍java语言的特性、线程开发、图形用户开发(gui)、...
  •  5.2.3 做饭场景的类 102  5.2.4 修改后的妈妈类 102  5.3 知识点扩展——线程的状态 103  5.3.1 线程的创建状态 103  5.3.2 线程的暂停状态 104  5.3.3 线程的结束状态 106  5.4 小结 109  第6章 ...
  • GetPrinterDriverDirectory 判断指定系统中包含了打印机驱动程序目录是什么 GetPrintProcessorDirectory 判断指定系统中包含了打印机处理器驱动程序及文件目录 OpenPrinter 打开指定打印机,并获取打印机...
  • 消息队列之推还是拉,RocketMQ Kafka如何做? 数据库 MySQL 索引、锁机制 事务特性、隔离级别 你怎么连模糊匹配like %%怎么优化都不知道 MySQL调优 国庆肝了8天整整2W字数据库知识点 MySQL索引凭什么让...
  • 8.1.3 Android对话框的特性  8.1.4 重新设计提示对话框  8.2 使用托管对话框  8.2.1 理解托管对话框协议  8.2.2 将非托管对话框重新转换为托管对话框  8.2.3 简化托管对话框协议  8.3 使用Toast  8.4...
  • 新书《跨终端 Web》

    2021-01-10 03:54:16
    客户端和动画开发成为了前端工程师基本功。移动优先跨终端解决方案核心一套数据有多个高品质低成本展现方式, 这促使前后端分离成为必须,前端工程师不仅仅要关心客户端环境也要关心服务端环境&#...
  • 精通ANDROID 3(中文版)1/2

    热门讨论 2012-08-31 14:17:45
    8.1.3 Android对话框的特性  8.1.4 重新设计提示对话框  8.2 使用托管对话框  8.2.1 理解托管对话框协议  8.2.2 将非托管对话框重新转换为托管对话框  8.2.3 简化托管对话框协议  8.3 使用Toast  8.4...
  • 5.1 什么是资源 72 5.1.1 应用程序资源存储方式位置 72 5.1.2 资源目录层级结构 72 5.1.3 资源类型 73 5.1.4 存储不同资源类型 74 5.1.5 使用程序访问资源 75 5.2 实例:使用Eclipse设置...
  • 书中采用深受读者欢迎step by step风格,指导读者通过具体示例来熟悉掌握asp.net4重要特性,并通过练习方式来进一步呈现演示,有助于读者采用ajax、wcf服务、自定义控件母版页等流行技术来创建出色...
  • Apache Sqoop: 一个用来将Hadoop关系型数据库中数据相互转移工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中数据导进到HadoopHDFS中,也可以将HDFS数据导进到关系型数据库中 ...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

动画场景的特性是什么和什么