贝塞尔曲线

本文介绍了Android动画的基础知识,包括逐帧动画、补间动画和属性动画,并详细讲解了属性动画的工作原理及如何利用贝塞尔曲线计算物体的运动轨迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从Android动画到贝塞尔曲线

144
作者 _念欣
2016.06.13 18:28 字数 2406 阅读 2877 评论 13

基础知识:

动画通过连续播放一系列画面,给视觉造成连续变化的图画。很通俗的一种解释。也很好理解。那么我们先来一个案例看看。

动画案例:百度贴吧小熊奔跑

效果:


topic.gif

代码:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@drawable/gif_loading1" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading2" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading3" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading4" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading5" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading6" android:duration="50"></item>
        <item android:drawable="@drawable/gif_loading7" android:duration="50"></item>
    </animation-list>
        AnimationDrawable iv_topicAnimation;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_topic);
            ImageView iv_topic = (ImageView) findViewById(R.id.iv_topic);
            iv_topic.setBackgroundResource(R.drawable.anim_topic);
            iv_topicAnimation = (AnimationDrawable) iv_topic.getBackground();
        }

        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            iv_topicAnimation.start();
        }

        public static void startActiivty(Context context) {
            context.startActivity(new Intent(context, TopicActivity.class));
        }

It’s important to note that the start()
method called on the AnimationDrawable cannot be called during the onCreate()
method of your Activity, because the AnimationDrawable is not yet fully attached to the window. If you want to play the animation immediately, without requiring interaction, then you might want to call it from the onWindowFocusChanged() method in your Activity, which will get called when Android brings your window into focus.

可以看到,实现小熊奔跑的效果是非常简单的。你需要理解的是

1.小熊奔跑的效果是有一张张图片交替播放,而动起来的。
2.动画通过连续播放一系列画面,给视觉造成连续变化的图画。


Paste_Image.png

好了,前面只是一个热身,下面才是真正的介绍Android动画了。

Android动画:

  • 逐帧动画(frame-by-frame animation)
  • 补间动画(tweened animation)
  • 属性动画(property animation)

对于逐帧动画和补间动画这里就不打算具体深入,但是你必须要知道的

  • 补间动画,只是改变View的显示效果而已,并不会真正的改变View的属性
  • 补间动画,只作用于View上面

写了个demo来解释一下上面的意思:


tween.gif
     bt_tween.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 300);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                    tv_tween_hello.startAnimation(animation);
                }
            });

            tv_tween_hello.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"hello animation",Toast.LENGTH_SHORT).show();
                }
            });

可以看到其实hello Animation平移之后点击没用了,而点击之前的位置的时候,还是有效的。这也正是我刚才说的

补间动画:只是改变View的显示效果而已,并不会真正的改变View的属性

看到这里,你也知道如果要用补间动画来做一些交互的动画是很蛋疼的。一般做法是:

属性动画

在介绍属性动画前,我们还是先来看一个demo。


property.gif
        protected Person person;
        protected TextView tv_property_info;
        protected Button bt_property;


        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_property);
            person = new Person();
            person.setName("张三");
            bt_property = (Button) findViewById(R.id.bt_property);
            tv_property_info = (TextView) findViewById(R.id.tv_property_info);
            bt_property.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            ObjectAnimator objectAnimator = ObjectAnimator.ofInt(person, "age", 1, 100);
            objectAnimator.addUpdateListener(this);
            objectAnimator.setDuration(5000);
            objectAnimator.start();
        }

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int values = (int) animation.getAnimatedValue();
            person.setAge(values);
            tv_property_info.setText(person.toString());
        }

上面代码模拟了一个Person对象,从0-100岁之间的变化,可能你有点看不懂。我这是在干嘛,但是如果你还记的刚才我说的。属性动画,可以对任何对象属性进行修改,而补间动画,只作用于View上面。我们的demo就是对Person这个对象中属性age不断进行修改。现在,我们假设一个TextView要进行平移或则缩放,或则旋转。只要将对应的属性进行修改,然后重绘。不就可以达到动画的效果了吗?试试吧!


    protected TextView tv_property_info;
        protected Button bt_property;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_property);
            bt_property = (Button) findViewById(R.id.bt_property);
            bt_property.setText("View的改变");
            tv_property_info = (TextView) findViewById(R.id.tv_property_info);
            bt_property.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv_property_info, "TranslationY", 0, 300);
            objectAnimator.addUpdateListener(this);
            objectAnimator.setDuration(500);
            objectAnimator.start();
        }

我们来总结一下.当我们调用

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv_property_info, "TranslationY", 0, 300);
 objectAnimator.setDuration(500);

的时候,将初始值和结束值给ObjectAnimator,并且告诉它所需的时长,然后它的内部使用一种时间循环的机制来计算值与值之间的过渡。然后将变化的值返回给我们。然后我们获取这个间隙的值,重绘界面就给视觉造成连续变化的图画。那么内部是怎么计算这个值的呢?

TypeEvaluator
    /**
     * This evaluator can be used to perform type interpolation between <code>float</code> values.
     */
    public class FloatEvaluator implements TypeEvaluator<Number> {

        /**
         * This function returns the result of linearly interpolating the start and end values, with
         * <code>fraction</code> representing the proportion between the start and end values. The
         * calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>,
         * where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
         * and <code>t</code> is <code>fraction</code>.
         *
         * @param fraction   The fraction from the starting to the ending values
         * @param startValue The start value; should be of type <code>float</code> or
         *                   <code>Float</code>
         * @param endValue   The end value; should be of type <code>float</code> or <code>Float</code>
         * @return A linear interpolation between the start and end values, given the
         *         <code>fraction</code> parameter.
         */
        public Float evaluate(float fraction, Number startValue, Number endValue) {
            float startFloat = startValue.floatValue();
            return startFloat + fraction * (endValue.floatValue() - startFloat);
        }
    }

通过查看源码我们知道,系统内置了一个FloatEvaluator,它通过计算告知动画系统如何从初始值过度到结束值。如果,我们想要自己控制这个时间段的运动轨迹的话,就可以自定义TypeEvaluator来返回轨迹点。下面让我们自己定义一个TypeEvaluator吧!

动画案例:饿了么购物车。

先看效果图片,这样有利于思考.


想要实现这个效果,我们必须先定义一个类。来记录小球的x和y的变量。

        public class Point implements Parcelable {
            public int x;
            public int y;

            public Point() {}

            public Point(int x, int y) {
                this.x = x;
                this.y = y;
            }

            public Point(Point src) {
                this.x = src.x;
                this.y = src.y;
            }

            /**
             * Set the point's x and y coordinates
             */
            public void set(int x, int y) {
                this.x = x;
                this.y = y;
            }
          }

这个类是android自带的一个类。用来记录小球的运动轨迹点,那么现在我们只需要小球的起始点和终点,然后就可以计算出小球的运动轨迹。那么怎么获取开始点和终点呢?终点的话,是一个定值。而开始点是我们根据点击事件获取的。可以根据

     int position[] = new int[2];
     view.getLocationInWindow(position);

来获取x=position[0];y=position[1]; 现在起始点和终点都已经确定好了,那么我们来计算一下小球运动的轨迹吧。从动画中可以看出来。类似于抛物线。这里我想到了用贝塞尔曲线来做。因为我们只需要确定一个控制点,就可以根据公式算出小球的运动轨迹。


Paste_Image.png

二次方公式
二次方贝兹曲线的路径由给定点P0、P1、P2的函数B(t)追踪:



TrueType字型就运用了以贝兹样条组成的二次贝兹曲线。

有了计算公式,现在还缺一个控制点。那么这个点,该怎么确定呢?

    int pointX = (startPosition.x + endPosition.x) / 2;
    int pointY = (int) (startPosition.y - convertDpToPixel(100, mContext));
    Point controllPoint = new Point(pointX, pointY);

我这里确定控制点是,取起始点和终点X的中点,y取开始点网上偏移一个距离。这样就会有一个抛物线的角度了。当然你可以通过http://myst729.github.io/bezier-curve/ 微调下你的控制点。好了,现在我们3个点都已经确定好了,现在就需要计算小球的运动轨迹,然后绘制到Window上去就OK了。

     public class BezierEvaluator implements TypeEvaluator<Point> {

            private Point controllPoint;

            public BezierEvaluator(Point controllPoint) {
                this.controllPoint = controllPoint;
            }

            @Override
            public Point evaluate(float t, Point startValue, Point endValue) {
                int x = (int) ((1 - t) * (1 - t) * startValue.x + 2 * t * (1 - t) * controllPoint.x + t * t * endValue.x);
                int y = (int) ((1 - t) * (1 - t) * startValue.y + 2 * t * (1 - t) * controllPoint.y + t * t * endValue.y);
                return new Point(x, y);
            }
        }

上面就是取当小球在时间t的时候,x和y分别是多少,然后去改变View。

      @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Point point = (Point) animation.getAnimatedValue();
            setX(point.x);
            setY(point.y);
            invalidate();
        }

记得在动画播放完成后记得移除掉这个小球.

    anim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    ViewGroup viewGroup = (ViewGroup) getParent();
                    viewGroup.removeView(NXHooldeView.this);
                }
            });

那么现在如果叫你实现这种效果,你有思路吗?


也许放弃 才能靠近你 不再见你**
你才会把我记起 时间累积
这盛夏的果实 回忆里寂寞的香气
我要试着离开你 不要再想你
虽然这并不是我本意
你曾说过 会永远爱我
也许承诺 不过因为没把握 别用沉默
再去掩饰甚么 当结果是那么赤裸裸
以为你会说甚么 才会离开我

附上本有所有代码的链接:https://github.com/BelongsH/AnimationExample/tree/master

    </div>
    <!--  -->

    <div class="show-foot">
      <a class="notebook" href="/nb/1552831">
        <i class="iconfont ic-search-notebook"></i> <span>Android</span>




<!-- 文章底部作者信息 -->
    <div class="follow-detail">
      <div class="info">
        <a class="avatar" href="/u/8969a310e0ad">
          <img src="http://upload.jianshu.io/users/upload_avatars/763512/ab37c0d5ace7.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/144/h/144" alt="144">


_念欣

写了 9552 字,被 71 人关注,获得了 149 个喜欢



用心去做好一件事。

  <div class="support-author"><p>如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!</p> <div class="btn btn-pay">赞赏支持</div> <!----> <!----> <!----></div>

<div class="meta-bottom">
  <div class="like"><div class="btn like-group"><div class="btn-like"><a href="/sign_in"><i class="iconfont ic-like"></i>喜欢</a></div> <div class="modal-wrap"><a>86</a></div></div> <!----></div>
  <div class="share-group">
    <a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
      <i class="iconfont ic-wechat"></i>
    </a>
    <a class="share-circle" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&amp;url=',e(u),'&amp;title=',e(t||d.title),'&amp;source=',e(r),'&amp;sourceUrl=',e(l),'&amp;content=',c||'gb2312','&amp;pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','http://cwb.assets.jianshu.io/notes/images/4347404/weibo/image_9f581996d911.jpg', '推荐 _念欣 的文章《从Android动画到贝塞尔曲线》( 分享自 @简书 )','http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));" data-original-title="分享到微博">
      <i class="iconfont ic-weibo"></i>
    </a>
      <a class="share-circle" data-toggle="tooltip" href="http://cwb.assets.jianshu.io/notes/images/4347404/weibo/image_9f581996d911.jpg" target="_blank" data-original-title="下载长微博图片">
        <i class="iconfont ic-picture"></i>
      </a>
    <a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
      <ul class=&quot;share-list&quot;>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone')+'&amp;title='+e('推荐 _念欣 的文章《从Android动画到贝塞尔曲线》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-zone&quot;></i><span>分享到QQ空间</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter')+'&amp;text='+e('推荐 _念欣 的文章《从Android动画到贝塞尔曲线》( 分享自 @jianshucom )')+'&amp;related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-twitter&quot;></i><span>分享到Twitter</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-facebook&quot;></i><span>分享到Facebook</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-google&quot;></i><span>分享到Google+</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('http://www.jianshu.com/p/d9a3ae9e806d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban')+'&amp;title='+e('从Android动画到贝塞尔曲线')+'&amp;sel='+e(s)+'&amp;v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&amp;r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;><i class=&quot;social-icon-sprite social-icon-douban&quot;></i><span>分享到豆瓣</span></a></li>
      </ul>
    " data-original-title="" title="">更多分享</a>
  </div>
</div>
<div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="/assets/default_avatar/avatar_default-78d4d1f68984cd6d4379508dd94b4210.png"></a> <div class="sign-container"><a href="/sign_in" class="btn btn-sign">登录</a> <span>后发表评论</span></div></form></div> <div id="normal-comment-list" class="normal-comment-list"><div><div><div class="top"><span>13条评论</span> <a class="author-only">只看作者</a> <a class="close-btn" style="display: none;">关闭评论</a> <div class="pull-right"><a class="active">按喜欢排序</a><a class="">按时间正序</a><a class="">按时间倒序</a></div></div></div> <!----> <!----> <div id="comment-2744917" class="comment"><div><div class="author"><a href="/u/87b97b5b7ac9" target="_blank" class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/2170305/d94507beba95?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <div class="info"><a href="/u/87b97b5b7ac9" target="_blank" class="name">菲利柯斯</a> <!----> <div class="meta"><span>2楼 · 2016.06.13 22:28</span></div></div></div> <div class="comment-wrap"><p>objectannimation构造器中的参数是什么意思,带双引号那个。</p> <div class="tool-group"><a><i class="iconfont ic-zan"></i> <span>赞</span></a> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-2745082" class="sub-comment"><p><a href="/u/8969a310e0ad" target="_blank">_念欣</a>:
      <span><a href="/users/87b97b5b7ac9" class="maleskine-author" target="_blank" data-user-slug="87b97b5b7ac9">@菲利柯斯</a> 是你要改变对象的属性,</span></p> <div class="sub-tool-group"><span>2016.06.13 22:40</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2747914" class="sub-comment"><p><a href="/u/87b97b5b7ac9" target="_blank">菲利柯斯</a>:
      <span>输入什么字符都能识别?不太理解这个属性到底代表什么,比如输入scale,他就会缩放?</span></p> <div class="sub-tool-group"><span>2016.06.14 08:23</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2748626" class="sub-comment"><p><a href="/u/8969a310e0ad" target="_blank">_念欣</a>:
      <span><a href="/users/87b97b5b7ac9" class="maleskine-author" target="_blank" data-user-slug="87b97b5b7ac9">@菲利柯斯</a>  举个例子。比如Person类里面 有一个age,name这个叫做属性。 而属性动画,是针对任何对象的属性进行操作。ObjectAnimator内部的工作机制会去寻找这个属性名对应的get和set方法。  View里面有get/set scale 这个方法  然后会不断的给这个scale复制。从而达到动画的效果 <img src="http://assets.jianshu.io/assets/emojis/smile.png" alt=":smile:" title=":smile:" class="emoji" height="20" width="20"> </span></p> <div class="sub-tool-group"><span>2016.06.14 09:22</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <span class="line-warp">
      还有1条评论,
      <a>展开查看</a></span> <!----> <!----></div> <!----></div></div><div id="comment-2757276" class="comment"><div><div class="author"><a href="/u/507f45931bd6" target="_blank" class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/1458573/e817bc7ffbbd.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <div class="info"><a href="/u/507f45931bd6" target="_blank" class="name">天然鱼</a> <!----> <div class="meta"><span>3楼 · 2016.06.14 21:52</span></div></div></div> <div class="comment-wrap"><p>说好的贝塞尔曲线呢?</p> <div class="tool-group"><a><i class="iconfont ic-zan"></i> <span>赞</span></a> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-3408037" class="sub-comment"><p><a href="/u/76c827439977" target="_blank">Serven_</a>:
      <span><a href="/users/507f45931bd6" class="maleskine-author" target="_blank" data-user-slug="507f45931bd6">@天然鱼</a> 那个饿了吗的抛物线和那个红心上飘路径是通过贝塞尔曲线获取的吧,抛物线是二介贝塞尔曲线,红心上飘路劲应该是三阶贝塞尔曲线</span></p> <div class="sub-tool-group"><span>2016.08.02 11:07</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-2774594" class="comment"><div><div class="author"><a href="/u/6b9af5002b3f" target="_blank" class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/1874471/56320b806273?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <div class="info"><a href="/u/6b9af5002b3f" target="_blank" class="name">清风哥哥</a> <!----> <div class="meta"><span>4楼 · 2016.06.16 10:01</span></div></div></div> <div class="comment-wrap"><p>没看明白int position[] = new int[2];view.getLocationInWindow(position);这两句代码怎么就确定了始点和终点</p> <div class="tool-group"><a><i class="iconfont ic-zan"></i> <span>赞</span></a> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-2775174" class="sub-comment"><p><a href="/u/8969a310e0ad" target="_blank">_念欣</a>:
      <span><a href="/users/6b9af5002b3f" class="maleskine-author" target="_blank" data-user-slug="6b9af5002b3f">@清风哥哥</a> 你可以试试这个view。然后调用getLocaltion看看<img src="http://assets.jianshu.io/assets/emojis/blush.png" alt=":blush:" title=":blush:" class="emoji" height="20" width="20"></span></p> <div class="sub-tool-group"><span>2016.06.16 10:51</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2777562" class="sub-comment"><p><a href="/u/6b9af5002b3f" target="_blank">清风哥哥</a>:
      <span><a href="/users/8969a310e0ad" class="maleskine-author" target="_blank" data-user-slug="8969a310e0ad">@nianxin</a> 看了具体代码,现在知道了,不过你这里两句,写的确实不具体</span></p> <div class="sub-tool-group"><span>2016.06.16 13:54</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2788391" class="sub-comment"><p><a href="/u/8969a310e0ad" target="_blank">_念欣</a>:
      <span><a href="/users/6b9af5002b3f" class="maleskine-author" target="_blank" data-user-slug="6b9af5002b3f">@清风哥哥</a> 好的。谢谢你的建议。一会我改下。<img src="http://assets.jianshu.io/assets/emojis/smile.png" alt=":smile:" title=":smile:" class="emoji" height="20" width="20"><img src="http://assets.jianshu.io/assets/emojis/smile.png" alt=":smile:" title=":smile:" class="emoji" height="20" width="20"><img src="http://assets.jianshu.io/assets/emojis/smile.png" alt=":smile:" title=":smile:" class="emoji" height="20" width="20">非常感谢。</span></p> <div class="sub-tool-group"><span>2016.06.17 11:43</span> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-6716145" class="comment"><div><div class="author"><a href="/u/52a5271141db" target="_blank" class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/3223500/fc6f41a8b94c.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <div class="info"><a href="/u/52a5271141db" target="_blank" class="name">冬至丨</a> <!----> <div class="meta"><span>5楼 · 2016.12.27 14:16</span></div></div></div> <div class="comment-wrap"><p>谢谢楼主分享</p> <div class="tool-group"><a><i class="iconfont ic-zan"></i> <span>赞</span></a> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-6716614" class="comment"><div><div class="author"><a href="/u/52a5271141db" target="_blank" class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/3223500/fc6f41a8b94c.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <div class="info"><a href="/u/52a5271141db" target="_blank" class="name">冬至丨</a> <!----> <div class="meta"><span>6楼 · 2016.12.27 14:40</span></div></div></div> <div class="comment-wrap"><p>提个不成熟的小建议,要是能有注释,就锦上添花了,功底不够,读起来有点费劲</p> <div class="tool-group"><a><i class="iconfont ic-zan"></i> <span>赞</span></a> <a><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div></div></div> <!----> <!----></div></div>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值