Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》
转载本专栏文章,请注明出处尊重原创:博客地址http://blog.csdn.net/qq_32059827/article/details/52849676:小杨的博客
许多应用可能需要加入进度,例如下载、播放视频、音频、读取数据库等等,都需要一个等待状态的进度条。原生的进度条的确不美观,今天这篇小案例,就让咱们的进度条“靓起来”。
首先来看一个小案例,我们部队seekbae做样式修改,使用默认的效果。
定义一个布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:id="@+id/seekbar_tetview_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SeekBar自定义" /> <TextView
android:id="@+id/seekbar_tetview_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SeekBar拖动时信息提示" /> <SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:maxHeight="20dp"
android:minHeight="20dp"
android:paddingLeft="18dp"
android:paddingRight="18dp"
/> </LinearLayout>
布局里面两端TextView中一个用于告知拖动进度,一个告知当前拖动状态,在紧接着就是一个seekbar,我们设置它的进度满时为值为100。
看一下主活动中加载代码:
package com.itydl.seekbar; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView; public class MainActivity extends Activity { private SeekBar seekBar;
private TextView textView_one, textView_two; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView_one = (TextView) findViewById(R.id.seekbar_tetview_one);
textView_two = (TextView) findViewById(R.id.seekbar_tetview_two);
seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(seekbarChangeListener); } private OnSeekBarChangeListener seekbarChangeListener = new OnSeekBarChangeListener() { // 停止拖动时执行
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
textView_two.setText("停止拖动了!"); } // 在进度开始改变时执行
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
textView_two.setText("进度开始改变");
} // 当进度发生改变时执行,我们使用Handler更新UI。当然,直接在这里更新UI也是可以的。
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
textView_two.setText("正在进行拖动操作,还没有停下来一直再拖动");
Message message = new Message(); message.what = progress; handler.sendMessage(message); }
}; /**
* 用Handler来更新UI
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
textView_one.setText("当前拖动位置占 : "
+ msg.what + "/100");
} }; }
进度条改变的时候会回调监听事件,在运行之前我们先看看这个监听回调的方法的功能,有必要提及一下这个小知识:
//当拖动条发生变化时调用该方法
public void onProgressChanged(SeekBar seekBar,int progress,Boolean fromUser)
{System.out.println(progress);}
//当用户开始滑动滑块时调用该方法(即按下鼠调用一次)
public void onStartTrackingTouch(SeekBar seekBar){System.out.println(“start:=>”+seekBar.getProgress());}
//当用户结束对滑块滑动时,调用该方法(即松开鼠标)
public void onStopTrackingTouch (SeekBar seekBar)
{System.out.println(“stop:=>”+seekBar.getProgress());}}
好了,运行程序,如下:
接下来进入本博客的主题。修改seekBar的样式。
首先来一版图片版本的,即指示器、背景、进度条颜色都是用图片代替:
xml中seekbar的属性可以做如下修改:
<SeekBar
android:thumb="@drawable/video_progress_thumb"//图片
android:layout_width="0dp"
android:thumbOffset="0dp"
android:progressDrawable="@drawable/custom_seekbar"//自定义drawable
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:maxHeight="6dp"
android:minHeight="6dp"
android:layout_weight="1" />
做了修改,就标注一下都是什么意思,详细的解释如下:
<!--thumb表示控制按钮,就是拖动的那个小圆圈,成为指示器 -->
<!-- progressDrawable用于定义进度条的样式,包括背景、进度色、第二进度色等 。本身从系统的@android:style/Widget.SeekBar拷贝过来再做一下修改-->
<!-- android:thumbOffset="0dp"表示thumb图标的偏移量,设置为0表示图标从头开始 -->
指示器的引用直接是一张图片,进度的引用是通过自定义drawable方式。
@drawable/custom_seekbar的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- seekbar的大背景 -->
<item android:id="@android:id/background" android:drawable="@drawable/video_seekbar_bg">//引入图片
</item>
<!-- 第二进度样式 设置跟下面进度一样-->
<item android:id="@android:id/secondaryProgress" android:drawable="@drawable/video_seekbar_progress">
</item>
<!-- 进度的背景 -->
<item android:id="@android:id/progress" android:drawable="@drawable/video_seekbar_progress">//引入图片
</item>
</layer-list>
运行程序如下:
这个时候发现跟原生的还是有很大区别的。
紧跟节奏,上边是通过设置进度条背景图片方式来改变了样式,下面使用颜色修改进度条的样式。类似定义颜色选择器。利用颜色资源替代图片资源:
seekbar_define_color_style.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@android:id/background">
<shape>
<corners android:radius="10dip" /> <solid android:color="#ff0000" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="10dip" /> <solid android:color="#00ff00" />
</shape>
</clip>
</item> </layer-list>
然后把修改xml中这行代码android:progressDrawable="@drawable/seekbar_define_color_style"
最后运行看看结果:
该小案例完毕。
Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》的更多相关文章
- Android简易实战教程--第三十八话《自定义通知NotifiCation》
上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动.但是那里的通知没有加入些"靓点",这一篇就给它加入自定义的布局,完成自定义的通知. 应用:比如QQ音乐为例,当点击音乐播 ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
- Android简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- Android简易实战教程--第三十九话《Chronometer实现倒计时》
Android提供了实现按照秒计时的API,今天就是用这个API实现简单的倒计时. 来个布局: <?xml version="1.0" encoding="utf- ...
- Android简易实战教程--第三十九话《简单的模糊查询》
今天这一篇小案例模拟模糊查询,即输入一个字符,显示手机对应的所有存在该字符的路径. 布局: <?xml version="1.0" encoding="utf-8& ...
- Android简易实战教程--第三十一话《自定义土司》
最近有点忙,好几天不更新博客了.今天就简单点,完成自定义土司. 主布局文件代码: <RelativeLayout xmlns:android="http://schemas.andro ...
- Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/5279131 ...
- Android简易实战教程--第三十话《撕衣美女》
此篇邪恶一些,给单身屌丝发点"福利",通过图片的绘制,给美女脱掉衣服. 原理:图片覆盖图片,通过画笔对顶端的图片做一些特效处理,即手指触摸的地方,设置为透明.即可显示最底部的美女图 ...
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
随机推荐
- MySql 使用规范推荐
前言 废话不多说-- 一.基础规范 1.使用InnoDB存储引擎 支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 2.推荐使用utf8mb4字符集 无需转码,无乱码风险, 支 ...
- 【Swift】swift中懒加载的写法
swift中懒加载的写法,直接上例子 (懒加载一个遮罩视图) lazy var dummyView: UIView = { let v = UIView() v.backgroundColor = U ...
- python 随笔
python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 ...
- Redis安装与卸载
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它支持丰富的数据类型,和高速的内存读写.正在逐步取代memca ...
- [HNOI 2015]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- [TJOI 2017]异或和
Description 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题 ...
- [PA 2014]Kuglarz
Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+ ...
- POJ 1486二分图的必要边
题意:有n个大小不等透明的幻灯片(只有轮廓和上面的数字可见)A.B.C.D.E…按顺序叠放在一起,现在知道每个幻灯片大小,由于幻灯片是透明的,所以能看到幻灯片上的数字(给出了每个数字的坐标,但不知道这 ...
- hdu5651 xiaoxin juju needs help(逆元)
xiaoxin juju needs help Accepts: 150 Submissions: 966 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- [Noi2013]矩阵游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i ...