最近要做个小功能,现在市面上面的直播平台,像虎牙、斗鱼、抖音和快手等等,两个主播PK的时候进度条上面会有一个动画一直在重复,挺好看的,直接上图。
pk
简单说下思路,因为ProgressBar已经基本够使用了,所以就懒得重写个自定义ProgressBar,因为现在做的是分开的两个view,到时候想替换的话,会方便很多。
整体思路是ProgressBar因为是均分的进度条,会根据始末位置算百分比,我们同样可以根据进度条移动的距离,算出控件需要对应移动的距离。举个栗子:
进度条的最小单位 / 进度条的范围 = 移动的最小距离 / 总的距离(也就是控件的总宽度)
下面开始上代码:这个是播放gif写的自定义view
package com.cgg.pkprogress;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
public class GifView extends View {
//gif图片资源ID
protected int progress_gif;
protected int progress_width;
//gif动态效果总时长,在未设置时长时默认为1秒
private static final int DEFAULT_MOVIE_DURATION = 1000;
//Movie实例,用来显示gift图片
private Movie mMovie;
//显示gift图片的动态效果的开始时间
private long mMovieStart;
//动态图当前显示第几帧
private int mCurrentAnimationTime = 0;
//图片离屏幕左边的距离
private float mLeft;
//图片离屏幕上边的距离
private float mTop;
//图片的缩放比例
private float mScale;
//图片在屏幕上显示的宽度
private int mMeasuredMovieWidth;
//图片在屏幕上显示的高度
private int mMeasuredMovieHeight;
//是否显示动画,为true表示显示,false表示不显示
private boolean mVisible = true;
//动画效果是否被暂停
private volatile boolean mPaused = false;
public GifView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GifView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
obtainStyledAttributes(attrs);
}
private void obtainStyledAttributes(AttributeSet attrs) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
// 获取自定义属性
final TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.GifProgressBar);
progress_gif = attributes.getResourceId(R.styleable.GifProgressBar_progress_gif, -1);
progress_width = (int