精华内容
下载资源
问答
  • 同样一个小伙伴的需求,我帮忙做的实现,然后给我发了个小红包,今天上班可以任性一会一杯星巴克了,这里再次感谢扔物线大大教我写动画,哈哈哈哈~ 这次的十分钟动画同样只要十分钟就可以实现,没有标题狗哦。...

    emmmm....这次取标题好难啊,我也不知道这个动画叫什么名字好~

    同样是一个小伙伴的需求,我帮忙做的实现,然后给我发了几个小红包,今天上班可以任性一会点一杯星巴克了,这里再次感谢扔物线大大教我写动画,哈哈哈哈~

    这次的十分钟动画同样只要十分钟就可以实现,没有标题狗哦。

    顺便说一下,并不是我写的所有动画都会出十分钟系列的文章,前两次是绘制,这次主要是 ObjectAnimation,以后的十分钟系列也会是不同的知识点,喜欢的朋友关注一下呗。

    话题扯远了,先来看效果吧~

    这是我在 demo 上的实现效果~

    需求:参考设计图实现,越逼真越好。

    动画拆解

    老规矩,拿到动画,实现之前先惯例拆解,这次动画我们还是拆解成三个阶段吧。

    • 一阶段:在屏幕上以固定的速度依次出现十几个“惊悚”的表情icon,每个表情的旋转角度、位置随机、并且越靠近屏幕中央的 icon 越大。
    • 二阶段:根据各个 icon的旋转角度,“左右”抖动。注意这里不是屏幕的左右,而是 icon 的作用抖动。也就是说不同旋转角度的 icon,抖动的方向不一样。
    • 三阶段:放大到8倍大小,并且在放大动画执行到一半的时候,透明度从1到0.

    拆解动画的分步骤实现

    看到这里的小伙伴可以自行思考一下实现方式。

    思考三分钟。。。

    好,三分钟过去了。

    本次动画的三个阶段都是基于 ObjectAnimation 做的实现。如果对 ObjectAnimation 还不是特别了解的小伙伴赶紧儿去学一下一下 HenCoder 系列教程的1.6和1.7。

    一阶段

    这里有三个需求。

    • 以固定的速度在屏幕上出现若干个“惊悚”表情
    • 惊悚表情的旋转角度、位置随机
    • 越靠近屏幕中央的表情越大

    首先第一个问题,这个很简单,只牵涉到定时功能。在0 ~ n 的时间内依次绘制0 ~ m 个icon 即可。

    第二个问题,关于每个表情的旋转角度、位置的随机,可能会出现icon 重叠的问题,但是如果每次新增一个 icon 都要去检测一遍和现有 icon是否存在覆盖问题的话,性能上会比较尴尬,而且随机出现位置并不是强需求,最后和设计师沟通后,同意17个 icon 的大小、旋转角度写死。

    第三个问题,第二个问题解决了,第三个问题自然不存在了。

    哈哈哈哈哈,是不是很棒,程序员要记得勇敢的去和设计师沟通。
    好了,我还是说一下如果设计师不同意写死位置,又要去 icon 不能相互覆盖的情况下,我们该怎么办。

    • 如果检测新增 icon 是否会遮盖其他已存在 icon?首先我们把一个 看成是一个圆,icon 会随机生成一个圆心 point(x,y),同时我们也能根据大小计算出半径。然后在添加之前去遍历已存在的 icon,判断新老 icon 的圆心距离是否大于半径只和。
    • 如何约靠近屏幕中心表情越大。设置根据 icon 的圆心点 point(x,y),再根据屏幕中间的点 center(centX,centY),设置一个 x 轴的居中系数和一个 y 轴的居中系数,然后根据这两个个系数设置 icon 的 scale 大小。

    由于这里的参数牵涉到 icon 的圆心点位置 x、y,旋转角度 rotate,缩放大小 scale。所以我们可以创建一个 bean IconInfo 来保存这些信息。

    二阶段

    需求:根据 icon 的旋转角度,做左右抖动的操作。

    这个有点尴尬,如果只是0度的旋转,那么左右抖动 50px 就只需要 x 轴加减50px 就行了。but,90度的旋转就变成了 y 轴加减 50px了。这两种情况还好,那么45度呢?岂不是变成了 x、y 轴同时加减

    $$ \dfrac{ \sqrt{2}}{2} *50$$

    咦,当时我是想到了这里,突然有了思路,这特么不就是一个计算正弦余弦的公司嘛。所以,当旋转角度为 rotate的时候,x 轴的偏离方向就是 cos(rotate) · offset, y 轴就是 sin(rotate)·offset。

    这个正弦余弦是初中的数学知识,大家应该都看得懂吧。

    三阶段

    这个没什么意思,就是一个 scaleX、scaleY和 alpha 的操作了。

    代码实现

    由于这不是我自己的项目,也不清楚是否有其他类似的需求,那么代码实现上,应该尽量的解耦,最好是能够一行代码调用就能够显示这个动画。

    想象一下,我们的 Toast、SnackBar ,同样是在屏幕上弹出一个节目,但他们的实现多么解耦。

    这次我的实现参考了 SnackBar ,不用在布局文件里面入侵代码,实现了一行代码显示动画,即插即用~哈哈哈哈哈

    先来感受一下代码的调用~

    findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AnimationHelper.start(v);
            }
        });复制代码

    好了,不扯犊子了,我直接贴代码。

    public class AnimationHelper {
    
    public static void start(View view) {
        ViewGroup suitableParent = findSuitableParent(view);
        MyView child = new MyView(view.getContext());
        suitableParent.addView(child);
    }
    
    private static ViewGroup findSuitableParent(View view) {
        ViewGroup fallback = null;
        do {
            if (view instanceof FrameLayout) {
                if (view.getId() == android.R.id.content) {
                    return (ViewGroup) view;
                } else {
                    fallback = (ViewGroup) view;
                }
            }
            if (view != null) {
                final ViewParent parent = view.getParent();
                view = parent instanceof View ? (View) parent : null;
            }
        } while (view != null);
        return fallback;
    }
    
    private static class MyView extends View implements View.OnClickListener {
    
        private Bitmap mIcon;
        private Paint mPaint;
        private int mWidth;
        private int mHeight;
        private int showCount;
        private int shake;
        private ArrayList<AnimationInfo> mInfo = new ArrayList<>();
        Matrix mMatrix = new Matrix();
    
        public MyView(Context context) {
            super(context);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            mWidth = MeasureSpec.getSize(widthMeasureSpec);
            mHeight = MeasureSpec.getSize(heightMeasureSpec);
            init();
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
    
        private void init() {
            if (mWidth == 0)
                return;
            mIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_face_shock);
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.WHITE);
    
    
            mInfo.clear();
    
            int width = (int) (mIcon.getWidth() * 0.5);
            int height = (int) (mIcon.getHeight() * 0.5);
            int centerX = mWidth / 2 - width / 2;
            mInfo.add(new AnimationInfo(0.5F, 0, centerX + width * 4F, mHeight * 3 / 4 - height));
            mInfo.add(new AnimationInfo(0.55F, 20, centerX + width * 3.4F, mHeight * 3 / 4 - height * 2.2F));
            mInfo.add(new AnimationInfo(0.6F, 340, centerX + width * 2.6F, mHeight * 3 / 4 - height * 3.5F));
    
            mInfo.add(new AnimationInfo(0.65F, 20, centerX - width, mHeight / 2 - height));
            mInfo.add(new AnimationInfo(0.6F, 340, centerX - width * 2.8F, mHeight / 2 + height));
    
            mInfo.add(new AnimationInfo(0.5F, 20, centerX + width * 0.5F, mHeight / 4 - height * 2F));
    
            mInfo.add(new AnimationInfo(0.7F, 320, centerX, mHeight / 2F));
    
            mInfo.add(new AnimationInfo(0.5F, 40, centerX - width * 0.8F, mHeight / 2 + height * 3F));
    
            mInfo.add(new AnimationInfo(0.7F, 250, centerX - width * 2F, mHeight / 2 - height * 2F));
    
            mInfo.add(new AnimationInfo(0.6F, 320, centerX - width * 3F, mHeight / 2 - height * 1.5F));
    
            mInfo.add(new AnimationInfo(0.7F, 45, centerX + width * 3F, mHeight / 2 - height * 2F));
    
            mInfo.add(new AnimationInfo(0.75F, 20, centerX, mHeight / 2 - height * 2.5F));
    
            mInfo.add(new AnimationInfo(0.6F, 320, centerX + width * 1.5F, mHeight / 2 - height * 4F));
    
            mInfo.add(new AnimationInfo(0.6F, 45, centerX + width * 0.5F, mHeight / 2 - height * 4.5F));
    
            mInfo.add(new AnimationInfo(0.5F, 320, centerX - width * 1.8F, mHeight / 2 - height * 5F));
    
            mInfo.add(new AnimationInfo(0.6F, 100, centerX + width * 1.8F, mHeight / 2 + height * 3F));
    
            mInfo.add(new AnimationInfo(0.5F, 320, centerX, mHeight / 2 + height * 5F));
    
            mInfo.add(new AnimationInfo(0.6F, 10, centerX - width * 0.5F, mHeight / 2 + height * 1.5F));
    
            showCount = 0;
    
            setOnClickListener(this);
    
            ObjectAnimator animator1, animator2, animator3;
    
    
            animator1 = ObjectAnimator.ofInt(this, "showCount", mInfo.size());
            animator1.setDuration(mInfo.size() * 35);
    
            animator2 = ObjectAnimator.ofInt(this, "shake", 0, 20, 0, -20, 0, 20, 0, -20);
            animator2.setDuration(300);
    
            PropertyValuesHolder scaleXValuesHolder = PropertyValuesHolder.ofFloat("scaleX", 1, 8);
            PropertyValuesHolder scaleYValuesHolder = PropertyValuesHolder.ofFloat("scaleY", 1, 8);
            Keyframe keyframe1 = Keyframe.ofFloat(0, 1);
            Keyframe keyframe2 = Keyframe.ofFloat(0.5f, 1);
            Keyframe keyframe3 = Keyframe.ofFloat(1, 0);
            PropertyValuesHolder alphaValuesHolder = PropertyValuesHolder.ofKeyframe("alpha", keyframe1, keyframe2, keyframe3);
            animator3 = ObjectAnimator.ofPropertyValuesHolder(this, scaleXValuesHolder, scaleYValuesHolder, alphaValuesHolder);
            animator3.setDuration(200);
    
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.playSequentially(animator1, animator2, animator3);
            animatorSet.start();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            if (showCount < mInfo.size()) {
                drawStep1(canvas);
            } else {
                drawStep2(canvas);
            }
    
        }
    
        private void drawStep1(Canvas canvas) {
            for (int i = 0; i < showCount && i < mInfo.size(); i++) {
                AnimationInfo info = mInfo.get(i);
                canvas.save();
                mMatrix.reset();
                mMatrix.postScale(info.scale, info.scale, info.x, info.y);
                mMatrix.postRotate(info.rotate, info.x, info.y);
                canvas.concat(mMatrix);
                canvas.drawBitmap(mIcon, info.x, info.y, mPaint);
                canvas.restore();
            }
        }
    
        private void drawStep2(Canvas canvas) {
            for (int i = 0; i < showCount && i < mInfo.size(); i++) {
                AnimationInfo info = mInfo.get(i);
                canvas.save();
                mMatrix.reset();
                float x = info.calculateTranslationX(shake);
                float y = info.calculateTranslationY(shake);
                mMatrix.postScale(info.scale, info.scale, x, y);
                mMatrix.postRotate(info.rotate, x, y);
                canvas.concat(mMatrix);
                canvas.drawBitmap(mIcon, x, y, mPaint);
                canvas.restore();
            }
        }
    
        @Override
        public void onClick(View v) {
            ViewGroup parent = (ViewGroup) v.getParent();
            parent.removeView(v);
        }
    
        @Keep
        private void setShowCount(int showCount) {
            this.showCount = showCount;
            invalidate();
        }
    
        @Keep
        private void setShake(int shake) {
            this.shake = shake;
            invalidate();
        }
    
    }
    
    private static class AnimationInfo {
        float scale;
        float rotate;
        float x;
        float y;
    
        public AnimationInfo(float scale, float rotate, float x, float y) {
            this.scale = scale;
            this.rotate = rotate;
            this.x = x;
            this.y = y;
        }
    
        public float calculateTranslationX(float length) {
            return (float) Math.cos(rotate) * length + x;
        }
    
        public float calculateTranslationY(float length) {
            return (float) Math.sin(rotate) * length + y;
        }
    
    
    }
    
    }复制代码

    代码比较简单,我就不写注释了。

    有几个点我想提一下~

    • 正常情况下,MyView 命名是不规范的,MyView 也不应该作为 AnimationHelper 的内部类,可以把 MyView单独提出了,AnimationInfo作为 MyView 的内部类。
    • AnimationHelper 里面的findSuitableParent 方法拷贝自 SnackBar,这个方法我在分析 SnackBar 源码的时候讲过,就不再赘述了。
    • onDraw 方法里面的drawStep1 和drawStep2其实可以合并成一个方法,我为了便于大家理解所以两个方法分开写了。
    • 如果你还有什么可以优化的代码,尽管拍砖,我都接着~
    • 绘制里面用到了 canvas 和Matrix 相关的代码如果看不懂可以去看扔物线的文章。
    • 以后想到再补充~

    喜欢记得点个关注哦~

    展开全文
  • 天真的忙的连轴转,白天要更文章和上课,今天早上八的课,你能想象七点五十起来,穿衣洗漱十分钟,八才出发的场景吗?想想就很刺激,走在路上,好家伙,一个人都没有,感觉整个校园都我的????????????到...

    你要的跨年祝福来了!!!

    每日三题 每日三题
    咳咳,懂事的孩子已经发我照片检查了👀^👀

    前言:

    “一个人的夜,我的心,应该放在哪里”、“我能给你个拥抱,像以前一样可以吗?”~~~马上就到2021年了,祝大家新的一年万事如意,一夜暴富
    每日三题

    顺便问一下,有没有好心人给我介绍个对象😎😎😎,毕竟有对象的才叫跨年,没对象的只能叫熬夜,😭😭😭

    每日三题
    不说了,我要去熬夜了!!!
    每日三题

    好了,话不多说,上题目!!!😍😍😍

    题目:

    (题目1) Canvas 和 SVG有什么区别 ?

    (题目2) HTML5 为什么只需要写 <!DOCTYPE HTML> ?

    (题目3) 如何在页面上实现一个圆形的可点击区域 ?

    倒计时10min,开始计时,看看自己能做对几道题😎😎😎?参考解析在下面,但不要直接看解析哦,这样子没什么效果的!!!

    每日三题

    参考解析:

    题目1:

    1.svg 绘制出来的每⼀个图形的元素都是独⽴的 DOM 节点,能够⽅便的绑定事件或⽤来修
      改。 canvas 输出的是⼀整幅画布
    2.svg 输出的图形是⽮量图形,后期可以修改参数来⾃由放⼤缩⼩,不会失真和锯⻮。⽽
      canvas 输出标量画布,就像⼀张图⽚⼀样,放⼤会失真或者锯⻮ 
    

    题目2:

    1.HTML5 不基于 SGML ,因此不需要对 DTD 进⾏引⽤,但是需要 doctype 来规范浏览器
      的⾏为
    2.HTML4.01 基于 SGML ,所以需要对 DTD 进⾏引⽤,才能告知浏览器⽂档所使⽤的⽂档
      类型
    

    题目3:

    1.svg
    2.border-radius
    3.纯 js 实现,需要求⼀个点在不在圆上的简单算法、获取⿏标坐标等等	   
    

    怎么样,是不是很简单,你做对了几道题呢?做对的再接再厉,不要骄傲,做错的也没有关系啦,好好总结,继续努力!!!

    当然啦,大家如果有补充的或者其它问题,欢迎大家在评论区交流啊,路漫漫其修远兮,吾将上下而求索,希望大家可以一起坚持下去啊!😎😎😎~~~

    每日三题

    如果这篇文章能够帮助到您,希望您不要吝惜点赞👍👍和收藏💖💖,您的支持是我继续努力的动力 💪💪!!!

    展开全文
  • 天真的忙的连轴转,白天要更文章和上课,今天早上八的课,你能想象七点五十起来,穿衣洗漱十分钟,八才出发的场景吗?想想就很刺激,走在路上,好家伙,一个人都没有,感觉整个校园都我的????????????到...

    前言:

    这几天真的是忙的连轴转,白天要更文章和上课,今天早上八点的课,你能想象七点五十起来,穿衣洗漱十分钟,八点才出发的场景吗?想想就很刺激,走在路上,好家伙,一个人都没有,感觉整个校园都是我的😂😂😂到了以后发现还好,老师并没有我来的早,所以这就不算迟到😁😁😁,如果大家觉得我很辛苦的话,就多多点赞、评论和转发吧,谢谢大家的支持啦,我知道大家都是老好人啦😘😘😘!!!

    每日三题
    每日三题

    好了,话不多说,上题目!!!😍😍😍

    题目:

    (题目1) Doctype的作用? 严格模式与混杂模式如何区分?它们有何意义 ?

    (题目2) 行内元素有哪些 ?块级元素有哪些 ? 空(void)元素有哪些 ?行内元
    素和块级元素有什么区别 ?

    (题目3) HTML全局属性(global attribute)有哪些?

    倒计时10min,开始计时,看看自己能做对几道题😎😎😎?参考解析在下面,但不要直接看解析哦,这样子没什么效果的!!!

    每日三题

    参考解析:

    题目1:

    1.<!DOCTYPE> 声明位于⽂档中的最前⾯,处于 <html> 标签之前。告知浏览器的解析
      器, ⽤什么⽂档类型规范来解析这个⽂档
    2.严格模式的排版和 JS 运作模式是 以该浏览器⽀持的最⾼标准运⾏
    3.在混杂模式中,⻚⾯以宽松的向后兼容的⽅式显示。模拟⽼式浏览器的⾏为以防⽌站点⽆
      法⼯作。DOCTYPE 不存在或格式不正确会导致⽂档以混杂模式呈现  
    

    题目2:

    1.⾏内元素有: a b span img input select strong
    2.块级元素有: div ul ol li dl dt dd h1 h2 h3 h4… p
    3.空元素: <br> <hr> <img> <input> <link> <meta>
    4.⾏内元素不可以设置宽⾼,不独占⼀⾏
    5.块级元素可以设置宽⾼,独占⼀⾏
    

    题目3:

    1.class :为元素设置类标识
    2.data-* : 为元素增加⾃定义属性
    3.draggable : 设置元素是否可拖拽
    4.id : 元素 id ,⽂档内唯⼀
    5.lang : 元素内容的的语⾔
    6.style : ⾏内 css 样式
    7.title : 元素相关的建议信息	   
    

    怎么样,是不是很简单,你做对了几道题呢?做对的再接再厉,不要骄傲,做错的也没有关系啦,好好总结,继续努力!!!

    当然啦,大家如果有补充的或者其它问题,欢迎大家在评论区交流啊,路漫漫其修远兮,吾将上下而求索,希望大家可以一起坚持下去啊!😎😎😎~~~

    每日三题

    如果这篇文章能够帮助到您,希望您不要吝惜点赞👍👍和收藏💖💖,您的支持是我继续努力的动力 💪💪!!!

    展开全文
  • 在学生课余吵闹的疯玩十分钟之后,我也正式开始了我的课程!一切进展很顺利!开始我很幽默地介绍了我的课堂四要求!哼哼!先跟你约法三章!看你以后还调皮不咯! 强调了纪律之后,我的精彩发挥了,我吸取了前面...
  • 记住今天

    2006-06-08 00:08:00
    开门一看,来接通校园网的个人。让进来后,不到十分钟,线就接通了。上网一试,速度还不错。晚上写下此文,作为纪念。这我的第一篇博客。 想想看,十年前我还在读书,根本没接触过网络。不知十年以后,又会...

         今天,2006年6月7日,家里开通了网络。

         下午6点多钟,我正准备出去打球,门铃响了。开门一看,是来接通校园网的几个人。让进来后,不到十分钟,线就接通了。上网一试,速度还不错。晚上写下此文,作为纪念。这是我的第一篇博客。

         想想看,十年前我还在读书,根本没接触过网络。不知十年以后,又会变成什么样,真想不到。

    展开全文
  • 微视频

    2021-01-02 17:57:47
    <div><p>网上微视频的定义,我觉得和咱们想要的基本相符。所以咱们不用再改成”小视频“或”短视频“了,...本帖从细节上讨论个小。</p><p>该提问来源于开源项目:happypeter/onestep</p></div>
  • Linux 操作系统基础教程 清华大学信息学院计算机系 ...从网上下载的,但是我不推荐易用这种方法得到 Linux,因为仅仅核心就有十个 Mbit 的 数据量,而一个完整的发行版本大概都 1Gbit 左右的数据量...
  • 两款定时提醒休息工具-IT人士必备

    千次下载 热门讨论 2012-03-14 11:31:20
    就我而言,我没办法只是呆呆地站立分钟啥也不干,我得找事情做。如果我站起来不想伸展一下的话,iCade会给我增加一些目标感。 •把那些蹩脚的广告变成必须站立起来的理由 电视广告毫无意义。与其坐在那里浪费...
  • 护眼吧2009

    2013-11-01 09:53:32
    就我而言,我没办法只是呆呆地站立分钟啥也不干,我得找事情做。如果我站起来不想伸展一下的话,iCade会给我增加一些目标感。 •把那些蹩脚的广告变成必须站立起来的理由 电视广告毫无意义。与其坐在那里浪费...
  • 一个牛人提供的GIS源码(很好)

    千次下载 热门讨论 2010-08-25 22:49:21
    加上大陆地区太多的炮制太另人失望了(去年非常红火的百万首页,在大陆地区做的烂的一塌,只会炮制没有有创意或者在人家创意的基础上增加自己创意的,唉)。 非常的希望大家能够给我意见或者建议,对大家提供的...
  • 我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至百万行,而且细节之间经常互相关联,要...
  • 我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至百万行,而且细节之间经常互相关联,要...
  • 年甚至在网上还掀起了豆腐脑“咸甜大战”,老饭骨今天带给大家咱们老北京家常豆腐脑的做法,无论你甜咸酸辣党,都可以参考! 用料超级丰富的卤汁搭配嫩滑柔软的豆花,入口即化...
  • 一会十分钟以后 60 00:02:40,280 --> 00:02:43,680 咱们再把它和一下 就好了 61 00:02:43,680 --> 00:02:46,680 这面可饧半天了 咱看看怎么样啊 62 00:02:46,680 --> 00:02:49,320 再揉揉 63 00:02:49,...
  • 一切断以后下锅煎 它就不会回来了 14 00:00:38,720 --> 00:00:40,840 15 00:00:40,840 --> 00:00:42,440 立着 16 00:00:42,440 --> 00:00:45,720 适合快餐 17 00:00:45,720 --> 00:00:48,200 到时候...
  • 它这个最好十分钟(再切) 100 00:04:22,000 --> 00:04:23,880 锯切 不能直切 101 00:04:23,880 --> 00:04:25,560 它凉了它就挺住了 102 00:04:25,560 --> 00:04:27,200 它一凉就挺住了...
  • 一个很关键的 67 00:02:30,600 --> 00:02:32,240 煮熟一个步骤 68 00:02:32,240 --> 00:02:35,680 为了让它成型比较好看 69 00:02:35,680 --> 00:02:37,160 蘸一下水 70 00:02:37,160 --&...
  • 盐 也把黏液能给它洗掉的 <p>39 00:01:33,720 --> 00:01:35,400 因为我们腌的时间短 <p>40 00:01:35,400 --> 00:01:37,520 要腌的稍微盐多一点 <p>41 00:01:37,520 --> 00:01:41,560 要说腌半小时 这...
  • 刮匀完了之后撒干面 这也一小技巧 56 00:02:36,960 --> 00:02:40,480 一它吸收了点油 57 00:02:40,480 --> 00:02:41,960 第二层次更清晰了 58 00:02:41,960 --> 00:02:47,320 这样弄完了之后就起这...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

十分钟以后是几点