Android贝塞尔曲线实现直播点赞效果

  

本文实例为大家分享了Android实现直播点赞效果的具体代码,供大家参考,具体内容如下

  

<>强效果展示

  

 Android贝塞尔曲线实现直播点赞效果

  

<强>原理分析

  

点赞效果最主要的难点和原理在于贝塞尔曲线动画的生成,我们通过图片主要讲解贝塞尔曲线动画

  

1,需要找到贝塞尔曲线的四个点
  2,通过三级贝塞尔曲线的公式计算,获取贝塞尔曲线的轨迹路径点
  3,通过设置点赞图片X, Y坐标,从而形成点赞的效果

  

<强>  Android贝塞尔曲线实现直播点赞效果

  

<>强实现步骤

  

1,初始化变量

     //1,继承RelativeLayout   公共类ChristmasView扩展RelativeLayout实现视图。OnClickListener {      私人上下文语境;//2,准备几张点赞图片   私人int [] christmas_drawable={R.drawable。christmas01 R.drawable。christmas02, R.drawable.christmas03   ,R.drawable。christmas04 R.drawable。christmas05 R.drawable.christmas06};//随机数种子   私人随机随机=new随机();//视图的宽高   私人int宽度、高度;//图片的宽高   私人int drawableWidth drawableHeight;      公共ChristmasView(上下文语境){   这(上下文,null);   }      公共ChristmasView(上下文语境,AttributeSet attrs) {   这(上下文、attrs 0);   }      公共ChristmasView(上下文语境、AttributeSet attrs int defStyleAttr) {   超级(上下文、attrs defStyleAttr);      这一点。上下文=上下文;//3、设置点击事件   setOnClickListener(这个);//4,获取点赞图片的宽高   可拉的可拉的=ContextCompat。getDrawable(上下文,R.drawable.christmas01);   drawableWidth=drawable.getIntrinsicWidth ();   drawableHeight=drawable.getIntrinsicHeight ();   }   }      @Override   公共空间>   私人空间addChristmas(上下文语境){/* *   * 1,点击一次增加一张图片在底部   */最后ImageView ImageView=new ImageView(上下文);   imageView.setBackgroundResource (christmas_drawable [random.nextInt (christmas_drawable。长度- 1)));   RelativeLayout。LayoutParams params=new LayoutParams (ViewGroup.LayoutParams.WRAP_CONTENT   ViewGroup.LayoutParams.WRAP_CONTENT);   params.addRule (ALIGN_PARENT_BOTTOM);   params.addRule (CENTER_HORIZONTAL);   imageView.setLayoutParams (params);   addView (imageView);//2,开始执行点赞效果   AnimatorSet AnimatorSet=getAnimatorSet (imageView);   animatorSet。addListener(新AnimatorListenerAdapter () {   @Override   公共空间>   私人AnimatorSet getAnimatorSet (ImageView ImageView) {   AnimatorSet输入=new AnimatorSet ();//1、缩放动画   AnimatorSet scaleAnimator=new AnimatorSet ();   ObjectAnimatorα=ObjectAnimator。ofFloat (imageView,“阿尔法”,0.3 f, 1 f);   ObjectAnimator scaleX=ObjectAnimator。ofFloat (imageView“scaleX”, 0.3 f, 1 f);   ObjectAnimator写入scaleY=ObjectAnimator。ofFloat (imageView“写入scaleY”, 0.3 f, 1 f);   scaleAnimator.setDuration (300);   scaleAnimator。playTogether(αscaleX,写入scaleY);//2,贝塞尔动画   ValueAnimator bezierAnimator=getBezierAnimator (imageView);//3,两个动画按顺序播放   进入。playSequentially (scaleAnimator bezierAnimator);   返回输入;   }   之前      

4,贝塞尔曲线动画

  

它需要一个估值器,不断的计算它的运行轨迹,从起始点到终点开始计算,当中也需要中间另外的两个点进行辅助计算,这些都是由贝塞尔曲线的公式所决定的

     /* *   *贝塞尔曲线估值器:计算动画的执行轨迹   *   * @params传入贝塞尔曲线需要的四个点   * @return通过计算返回贝塞尔曲线的坐标   */公共类BezierEvaluator实现TypeEvaluator{      私人PointF point1;   私人PointF卷帘窗;      公共BezierEvaluator (PointF point1, PointF卷帘窗){   这一点。point1=point1;   这一点。卷帘窗=卷帘窗;   }      @Override   公共PointF评估(t,浮动PointF point0, PointF point3) {   PointF点=new PointF ();//t取值为[0,1]/* *   *三阶贝塞尔公式   *   * B (t)=(1 - t) ^ 3 P0   * + 3 t (1 - t) ^ 2 P1   * t ^ 2 + 3 (1 - t) P2   * + t ^ 3 P3   */点。x=point0。x * (1 - t) * (1 - t) * (1 - t)   + 3 * point1。x * t * (1 - t) * (1 - t)   + 3 *卷帘窗。x * t * t * (1 - t)   + point3。x * t * t * t;/* *   *三阶贝塞尔公式   *   * B (t)=(1 - t) ^ 3 P0   * + 3 t (1 - t) ^ 2 P1   * t ^ 2 + 3 (1 - t) P2   * + t ^ 3 P3   */点。y=point0。y * (1 - t) * (1 - t) * (1 - t)   + 3 * point1。y * t * (1 - t) * (1 - t)   + 3 *卷帘窗。y * t * t * (1 - t)   + point3。y * t * t * t;      返回点;   }   }   

Android贝塞尔曲线实现直播点赞效果