本文实例为大家分享了Android实现视频播放进度条的具体代码,供大家参考,具体内容如下

首先来看一下效果图,如下所示:

其中进度条如下:

接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间。在SeekBar右边有一个文本框显示当前播放时间/总时间。

step1、先来看一看PopupWindow的布局文件,seek_popu.xml,效果如下图所示:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/seek_dialog_bg" >

android:id="@+id/dialogSeekTime"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="10dip"

android:layout_marginTop="12dip"

android:text="@string/unknow_seek_time"

android:textColor="@color/black"

android:textSize="12sp" />

step2、自定义一个SeekBar

import com.canplay.video.R;

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.PopupWindow;

import android.widget.SeekBar;

import android.widget.TextView;

/**

* 自定义进度拖动条控件

*/

public class MySeekBar extends SeekBar {

/**

* 定义一个展现时间的PopupWindow

*/

private PopupWindow mPopupWindow;

private View mView;

/**

* 显示时间的TextView

*/

private TextView dialogSeekTime;

/**

* 用来表示该组件在整个屏幕内的绝对坐标,其中 mPosition[0] 代表X坐标,mPosition[1] 代表Y坐标。

*/

private int[] mPosition;

/**

* SeekBar上的Thumb的宽度,即那个托动的小黄点的宽度

*/

private final int mThumbWidth = 25;

public MySeekBar(Context context) {

this(context, null);

}

public MySeekBar(Context context, AttributeSet attrs) {

super(context, attrs);

mView = LayoutInflater.from(context).inflate(R.layout.seek_popu, null);

dialogSeekTime = (TextView) mView.findViewById(R.id.dialogSeekTime);

mPopupWindow = new PopupWindow(mView, mView.getWidth(), mView.getHeight(), true);

mPosition = new int[2];

}

/**

* 获取控件的宽度

*

* @param v

* @return 控件的宽度

*/

private int getViewWidth(View v) {

int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

v.measure(w, h);

return v.getMeasuredWidth();

}

/**

* 获取控件的高度

*

* @param v

* @return 控件的高度

*/

private int getViewHeight(View v) {

int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

v.measure(w, h);

return v.getMeasuredHeight();

}

/**

* 隐藏进度拖动条的PopupWindow

*/

public void hideSeekDialog() {

if (mPopupWindow != null && mPopupWindow.isShowing()) {

mPopupWindow.dismiss();

}

}

/**

* 显示进度拖动条的PopupWindow

*

* @param str

* 时间值

*/

public void showSeekDialog(String str) {

dialogSeekTime.setText(str);

int progress = this.getProgress();

// 计算每个进度值所占的宽度

int thumb_x = (int) (progress * (1.0f * (this.getWidth() - 22) / this.getMax())); //22是两边的空白部分宽度

// 更新后的PopupWindow的Y坐标

int middle = this.getHeight() / 2 + 120;

if (mPopupWindow != null) {

try {

/*

* 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。

* 其中 mPosition[0] 代表X坐标,mPosition[1]代表Y坐标。

*/

this.getLocationOnScreen(mPosition);

// 相对某个控件的位置(正左下方),在X、Y方向各有偏移

mPopupWindow.showAsDropDown(this, (int) mPosition[0], mPosition[1]);

/*

* 更新后的PopupWindow的X坐标

* 首先要把当前坐标值减去PopWindow的宽度的一半,再加上Thumb的宽度一半。

* 这样才能使PopWindow的中心点和Thumb的中心点的X坐标相等

*/

int x = thumb_x + mPosition[0] - getViewWidth(mView) / 2 + mThumbWidth / 2;

// 更新popup窗口的位置

mPopupWindow.update(x, middle, getViewWidth(mView), getViewHeight(mView));

} catch (Exception e) {

}

}

}

}

step3、将自定义的拖动条加入到布局文件中,下面是部分代码

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@android:color/black" >

......

android:id="@+id/seek_bar_container"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_above="@id/control_btn_container"

android:background="@drawable/seek_bg" >

android:id="@+id/seek_progress"

android:layout_width="600dip"

android:layout_height="wrap_content"

android:layout_centerInParent="true" />

android:id="@+id/currentTime"

style="@style/seekTime"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_toRightOf="@id/seek_progress"

android:paddingLeft="20dip"

android:text="@string/unknow_time" />

...............

step4、在主文件中对拖动条进行托动监听

mSeekBar = (MySeekBar) findViewById(R.id.seek_progress);

mSeekBar.setOnSeekBarChangeListener(mSeekBarListener);

/**

* 进度拖动条监听器

*/

private OnSeekBarChangeListener mSeekBarListener = new OnSeekBarChangeListener() {

// 通知进度已经被修改

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

if (isTouchSeeked) {

mSeekBar.showSeekDialog(makeTimeString(progress));//动态展示当前播放时间

} else {

mSeekBar.hideSeekDialog();

}

}

// 通知用户已经开始一个触摸拖动手势

public void onStartTrackingTouch(SeekBar seekBar) {

showControlView(3600000);

isTouchSeeked = true;

}

// 通知用户触摸手势已经结束

public void onStopTrackingTouch(SeekBar seekBar) {

Message msg = Message.obtain();

msg.what = PROGRESS_SEEKTO;

msg.arg1 = seekBar.getProgress();

mHandler.removeMessages(PROGRESS_SEEKTO);

mHandler.sendMessageAtTime(msg, 1000);// 1秒之后开始发送更新进度的消息

isTouchSeeked = false;

showControlView(sDefaultTimeout);

}

};

其中将进度值转换为时间的方法makeTimeString(int secs)如下所示:

/**

* 格式化的Builder

*/

private StringBuilder sFormatBuilder = new StringBuilder();

/**

* 格式化的Formatter

*/

private Formatter sFormatter = new Formatter(sFormatBuilder, Locale.getDefault());

/**

* 格式化的相关属性

*/

private final Object[] sTimeArgs = new Object[3];

/**

* 转换进度值为时间

*

* @param secs

* @return

*/

private String makeTimeString(int secs) {

/**

* %[argument_index$][flags][width]conversion 可选的

* argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$"

* 引用,第二个参数由 "2$" 引用,依此类推。 可选 flags

* 是修改输出格式的字符集。有效标志集取决于转换类型。 可选 width

* 是一个非负十进制整数,表明要向输出中写入的最少字符数。 可选 precision

* 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。 所需 conversion

* 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。

*/

String durationformat = getString(R.string.durationformat);//

// id="format">%1$02d:%2$02d:%3$02d

sFormatBuilder.setLength(0);

secs = secs / 1000;

Object[] timeArgs = sTimeArgs;

timeArgs[0] = secs / 3600; // 秒

timeArgs[1] = (secs % 3600) / 60; // 分

timeArgs[2] = (secs % 3600 % 60) % 60; // 时

return sFormatter.format(durationformat, timeArgs).toString().trim();

}

当然,这里只是简单的介绍了下自定义进度条,而该进度条的样式都没有展现出来,样式读者可以自己定义。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android自定义seekbar,Android自定义SeekBar实现视频播放进度条相关推荐

  1. android下载通知栏,Android开发中实现下载文件通知栏显示进度条

    android开发中实现下载文件通知栏显示进度条. 1.使用asynctask异步任务实现,调用publishprogress()方法刷新进度来实现(已优化) public class myasync ...

  2. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

  3. android仿微信 进度条,Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是 ...

  4. 基于vue2.0实现音乐/视频播放进度条组件的思路及具体实现方法+代码解释

    基于vue2.0实现音乐/视频播放进度条组件的方法及代码解释 需求分析: ①:进度条随着歌曲的播放延长,歌曲播放完时长度等于黑色总进度条长度:时间实时更新. ②:当滑动按钮时,实时更新播放时间,橙色进 ...

  5. Unity实现类似于苹果视频播放器视频播放进度条及声音进度条拖拽功能

    Unity实现类似于苹果视频播放器视频播放进度条及声音进度条拖拽功能 前言 我在之前的博客里介绍过关于VideoPlayer的简单使用流程,之前一直想研究下videoPlayer中的使用进度条控制视频 ...

  6. seekbar自定义android,Android自定义SeekBar实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在Seek ...

  7. android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...

    这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下: 思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度:第二部分是右侧灰色的直 ...

  8. Android自定义成长值、等级、积分进度条(带属性动画)

    现在很多APP的会员进度条.等级.积分进度条都是按分段显示的,由于最近自己的项目也用到类似的控件,如下图所示,于是就自己撸了一个! package progressandanimation.wtt.c ...

  9. android 曲线进度条,Android自定义View——使用贝塞尔曲线实现流量进度条

    第一次写带图片的博客,多少还是有点紧张,效果不好,请将就着看,前面的图是今天要写的控件的效果图,元素不多,分别是一个按钮和一个自定义的控件. 在此以前,我看过许多的书,比如<Android群英传 ...

最新文章

  1. 皮一皮:这是歪打正着了???
  2. vb.net2019-hello,world
  3. MIT 学生挑战新泽西索取挖矿程序源代码的要求
  4. 解决tsvncache.exe引起电脑慢的问题
  5. 物联网初步之电阻性电路分析 第三部分 电路分析方法和电路原理
  6. redis和sqlserver数据同步_SQLServer数据库之redis数据库的数据导入到SQLServer数据库中...
  7. Spark GraphX 的数据可视化
  8. 文件操作--设置文件属性、获取文件属性
  9. Teststand: 如何让一个测试步骤不要在报告里生成
  10. VMware安装及使用详细教程
  11. python算方差_Python求均值,方差,标准差的实例
  12. kafka中topic默认属性_Kafka的Topic配置详解
  13. 实时频谱分析仪作下变频器的技术实现
  14. 按键精灵 android版运行异常,按键精灵安卓版 tap、touch命令 不好用的解决办法!...
  15. 支付宝的蚂蚁积分用途很多,别不当回事儿,用得好能省很多钱哦!
  16. 蓝牙耳机录音进行讯飞语音识别
  17. 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换
  18. iPhone(IOS10)忘记了访问限制的密码该怎么办?
  19. java读取pdf多表格_在Java中使用tabula提取PDF中的表格数据
  20. [oracle]7788

热门文章

  1. 海思芯片研究开篇介绍
  2. 北方民族大学计算机科学与工程学院研究生导师
  3. 隐藏浏览器自带滚动条方法
  4. P1640 [SCOI2010]连续攻击游戏:(二分图)
  5. js ↵ 换行 转换 br /n
  6. matlab小车直线加速动画,通过MATLAB/Simulink处理测试数据加速车辆控制算法仿真和设计...
  7. 基于keras的python实践_keras快速上手-基于python的深度学习实践_第8章_文字生成源代码...
  8. 函数式编程中的战斗机--elm编写实例(薛定鄂的猫
  9. gzinflate php cetnos,Centos 6.5升级git版本的办法
  10. java编写坦克大战