[关闭]
@DevWiki 2018-12-06T15:42:44.000000Z 字数 2566 阅读 1609

Android实现微信录制小视频的计时动画

Android


使用微信录制小视频时会有一个倒计时的横线,如下图:

这个横线怎么实现呢?

尝试了以下几种方法:

第一种方式使用ProgressBar,但是暂时不知道如何实现.
第二种方式在绘制过程中出现卡顿,没有更好的解决办法,相对较麻烦.
第三种方式定时器动态改变宽度仍旧会出现卡顿现象.

卡顿! 卡顿!! 卡顿!!!

用什么解决卡顿呢?

用动画,对了,使用Animator.动画来解决卡顿,动态改变View的宽度.

于是自定义了一个LineView

  1. public class LineView extends View{
  2. public LineView(Context context) {
  3. super(context);
  4. }
  5. public LineView(Context context, AttributeSet attrs) {
  6. super(context, attrs);
  7. }
  8. public void setLayoutWidth(int width){
  9. ViewGroup.LayoutParams params = getLayoutParams();
  10. params.width = width;
  11. setLayoutParams(params);
  12. }
  13. }

和普通的view相比,就多了一个方法:

  1. public void setLayoutWidth(int width){
  2. ViewGroup.LayoutParams params = getLayoutParams();
  3. params.width = width;
  4. setLayoutParams(params);
  5. }

为什么加一个这个方法呢?这个方法的其实就是设置View的布局宽度,但是在ObjectAnimator里面,需要一个可以使用的属性来改变,为此我创造一个属性layoutWidth,于是动画就可以这样写:

  1. animator = ObjectAnimator.ofInt(lineView, "layoutWidth", width, 0);

布局文件很简单,就放一个LineView,一个Button.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity">
  8. <net.devwiki.lineview.LineView
  9. android:id="@+id/lineView"
  10. android:layout_width="match_parent"
  11. android:layout_height="1dp"
  12. android:layout_gravity="center_horizontal"
  13. android:layout_marginTop="100dp"
  14. android:background="@color/colorPrimary"/>
  15. <Button
  16. android:id="@+id/button"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_gravity="bottom"
  20. android:layout_marginTop="100dp"
  21. android:text="START"/>
  22. </LinearLayout>

在这把MainActivity也贴出来,如下:

  1. public class MainActivity extends AppCompatActivity {
  2. private Animator animator;
  3. private LineView lineView;
  4. private int width;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. Button button = (Button) findViewById(R.id.button);
  10. button.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. startAnimator();
  14. }
  15. });
  16. lineView = (LineView) findViewById(R.id.lineView);
  17. ViewTreeObserver observer = lineView.getViewTreeObserver();
  18. observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
  19. @Override
  20. public boolean onPreDraw() {
  21. width = lineView.getMeasuredWidth();
  22. Log.d("-----", "width:" + width);
  23. return true;
  24. }
  25. });
  26. }
  27. private void startAnimator(){
  28. animator = ObjectAnimator.ofInt(lineView, "layoutWidth", width, 0);
  29. animator.setDuration(6000);
  30. animator.setInterpolator(new LinearInterpolator());
  31. animator.start();
  32. }
  33. }

噔噔噔噔,大功告成,看一下效果吧:

如果有好的方法,请留言或者联系我哦.点此查看联系方式

更多文章请移步我的博客:DevWiki's Bolg

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注