Android-做个性化的滚动条

1.案例效果图

2.准备素材

                              

progress1.png(78*78)              progress2.png(78*78)

3.原理

采用一张图片作为ProgressBar的背景图片(一般采用颜色比较浅的)。另一张是滚动条的图片(一般采用颜色比较深的图片)。进度在滚动是:滚动图片逐步显示,背景图片逐步隐藏,达到上面的效果。

4.灵感来自Android控件提供的源码

4.1 默认带进度的滚动条,如下图

    <ProgressBar
    android:id="@+id/progressBar2"
   style="@android:style/Widget.ProgressBar.Horizontal"
    android:layout_width="268dp"
    android:layout_height="wrap_content"
    android:progress="45" />

注意:关键是style属性在起作用

4.2 找到样式定义的位置

鼠标放在style属性值上,按下Ctrl键,出现超链接,点击超链接跳转到样式的定义位置

样式定义的内容如下

重点研究:

android:progressDrawable:滚动条的样式

@android:drawable/progress_horizontal:样式定义的文件

在android-sdk-windows\platforms\android-14\data\res目下搜索progress_horizontal.xml文件,搜索结果如下:

打开progress_horizontal.xml文件,内容如下

<layer-listxmlns:android="http://schemas.android.com/apk/res/android">
   <itemandroid:id="@android:id/background">
       <shape>
           <cornersandroid:radius="5dip"/>
           <gradient
                   android:startColor="#ff9d9e9d"
                   android:centerColor="#ff5a5d5a"
                   android:centerY="0.75"
                   android:endColor="#ff747674"
                   android:angle="270"
           />
       </shape>
   </item>
   <itemandroid:id="@android:id/secondaryProgress">
       <clip>
           <shape>
               <cornersandroid:radius="5dip"/>
               <gradient
                       android:startColor="#80ffd300"
                       android:centerColor="#80ffb600"
                       android:centerY="0.75"
                       android:endColor="#a0ffcb00"
                       android:angle="270"
               />
           </shape>
       </clip>
   </item>
   <itemandroid:id="@android:id/progress">
       <clip>
           <shape>
               <cornersandroid:radius="5dip"/>
               <gradient
                       android:startColor="#ffffd300"
                       android:centerColor="#ffffb600"
                       android:centerY="0.75"
                       android:endColor="#ffffcb00"
                       android:angle="270"
               />
           </shape>
       </clip>
   </item>
</layer-list>

释义:

<item android:id="@android:id/background">:定义滚动条的背景样式

<item android:id="@android:id/secondaryProgress">:第二滚动条的样式

<item android:id="@android:id/progress">:滚动条的样式

思考:如果我想做垂直滚动条,怎么办了?

关键在clip元素的属性上做修改

<clip

android:clipOrientation="vertical"    定义滚动的方向 vertical为垂直方向

android:drawable="@drawable/progress1"  定义滚动的图片

android:gravity="bottom" >  定义滚动的开始位置

</clip>

5.定义样式文件progress_vertical.xml

progress_vertical.xml文件代码如下

<?xmlversion="1.0"encoding="utf-8"?>
<layer-listxmlns:android="http://schemas.android.com/apk/res/android">
   <itemandroid:id="@android:id/progress">
       <clip
           android:clipOrientation="vertical"
           android:drawable="@drawable/progress1"
           android:gravity="bottom">
       </clip>
   </item>
</layer-list>

6.应用自定义的样式

   <Button
       android:id="@+id/btStart"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="150dp"
       android:text="开始"/>

   <ProgressBar
       android:id="@+id/pbPic"
       style="@android:style/Widget.ProgressBar.Horizontal"
       android:layout_width="50dp"
       android:layout_height="68dp"
       android:background="@drawable/progress2"
       android:max="100"
       android:progress="0"
       android:progressDrawable="@drawable/progress_vertical"/><!-- 在此属性上应用 -->

   <TextView
       android:id="@+id/txtProgress"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

7.点击按钮模拟滚动的效果

publicclass ProgressActivity extends Activity {
     ProgressBar pb =null;
     TextView txtProgress;
     Handler handler =new Handler();
     @Override
     publicvoid onCreate(BundlesavedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          System.out.println("主题=" + getTheme() + "");
          pb = (ProgressBar) findViewById(R.id.pbPic);
<pre code_snippet_id="609749" snippet_file_name="blog_20150301_5_812240" name="code" class="java"><span style="white-space:pre">	</span>   //按钮

Button btnStart = (Button) findViewById(R.id.btStart);


<pre code_snippet_id="609749" snippet_file_name="blog_20150301_5_812240" name="code" class="java"> <span style="white-space:pre">	</span>   //显示进度

txtProgress = (TextView) findViewById(R.id.txtProgress);


<pre code_snippet_id="609749" snippet_file_name="blog_20150301_5_812240" name="code" class="java"><span style="white-space:pre">	</span>   //按钮点击事件

btnStart.setOnClickListener(new OnClickListener() { publicvoid onClick(Viewv) {


<pre code_snippet_id="609749" snippet_file_name="blog_20150301_5_812240" name="code" class="java"><span style="white-space:pre">		</span>    //创建并启动线程,使用线程执行模拟的任务

new Thread(new Runnable() { publicvoid run() { for (inti = 0; i < 100;i++) {//循环100遍 try { handler.post(new Runnable() { //更新界面的数据 publicvoid run() { pb.incrementProgressBy(1);//增加进度


<pre code_snippet_id="609749" snippet_file_name="blog_20150301_5_812240" name="code" class="java"><span style="white-space:pre">								</span>  //显示完成的进度

txtProgress.setText(pb.getProgress() + "%"); } }); Thread.sleep(100); } catch (InterruptedExceptione) { } } } }).start(); } }); }}


时间: 2024-11-08 01:33:30

Android-做个性化的滚动条的相关文章

如何让多个android listview同时使用一个滚动条

如何让多个android listview同时使用一个滚动条 重新设置ListView的高度 /** * 设置listview高度,注意listview子项必须为LinearLayout才能调用该方法 * @param listview listview * */ public static void setListViewHeight(ListView listview) { int totalHeight = 0; ListAdapter adapter= listview.getAdapt

Android做下拉刷新的时候,在做些什么

1. 简介 好长时间没有写博客了,一来是工作忙,抽不出空,二来是迷上了王者荣耀.现在正好赶上项目空闲期,写一篇关于下拉刷新的文章,个人觉得上来加载更多功能使用场景非常少,而且没有必要做的那么麻烦,文章最后会提一下加载更多的实现. 最近项目中遇见了下拉刷新的需求,正好研究了一下,分享一下自己的心得. 主要参考文章或工程: 郭霖大神-Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能 自个儿写Android的下拉刷新/上拉加载控件 XListView 这三篇文章各自提供了实现下拉刷新的思

Android做了一年了,回头来看看Activity

Activity跳转主要有两种方式,如下所示: 其实精华,在这里,onResume,才是安卓程序员实际操作的东东.^_^ 命周期的每一个阶段都表示为金字塔上的一个台阶,当系统创建一个新的activity时,每一个回调函数都把activity的状态向上挪一步. 金子塔的最顶层就是activity运行在前景模式下,就是直接运行的状态. 当用户离开activity时,系统调用另一些回调函数,将activity的状态从金字塔中一步一步移下来.有些情况下,activity只移动一部分,并没有完全到底,这些

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK? 百度个性化地图Android SDK是一套基于Android 2.2及以上版本设备的应用程序接口,您可以通过该套接口实现基本的地图功能,并且可以定制地图样式,实现个性化地图. 该接口提供以下功能: 1.基本地图:提供地图(2D.3D)的展示和缩放.平移.旋转.改变视角等地图操作: 2.个性化地图:可以更改地图样式,让您的地图与众不同,实现个性化定制: 3.覆盖物:提供常见地图覆盖物(自定义标注.几何图形等),满足开发者的各种需求: 4.坐标映射:提供

请问android做个app价格多少

============问题描述============ 最近项目比较闲,和2个朋友接了个私活,但不知道怎么来定价,有什么标准吗 ============解决方案1============ 看地方,如果是大城市 就1W开价,1-2个月的工作量,业余时间做. ============解决方案2============ 就是看所在地薪资水平,还有工作量,难易程度等. ============解决方案3============ 没有必要看地方,直接看对方承受能力,工程量难度,这都是销售干的事,纯属忽悠

android做一个循环执行的线程

final Handler handler=new Handler(); final Runnable runnable=new Runnable() { @Override public void run() { // TODO Auto-generated method stub //要做的事情 handler.postDelayed(this, 1000); // 1秒后执行 } }; handler.postDelayed(runnable, 1000);//1秒执行一次runnable

Android Studio 个性化设置

android studio 正式版发布有段时间了,最近刚刚上手.对于用惯了eclipse的我来说还真是有些不适应,下面是一些设置,让AS 更顺手一些: 1.     关于project和module AS的Project相当于eclipse的workspace,module相当于eclipse的Project.AS好像不能设置Project的默认路径,每次都默认定位到C:/user/xx下边,挺不方便的. 2.     快捷键设置 AS的快捷键与eclipse的配置差挺多的,其实可以直接把快捷

java/android 做题中整理的碎片小贴士(2)

1.修饰activity的属性是theme,修饰view的属性是style,两者xml格式相同,只是能起作用的语句有所不同: 2.File实现了Serializable接口,因此可以通过intent传播: 3.android中,1pt大概等于2.22sp : 4.android中每个应用程序在自己的进程中运行,都拥有一个DVM实例,而每个DVM都是Linux中的一个进程,所以应用--DVM--进程可认为同一个概念: 5.通过getMetrics()获取屏幕属性,进而获得屏幕宽高: 6.在AVD虚

java/android 做题中整理的碎片小贴士(15)

1.java继承中对于构造函数时不继承的,只是显示或隐式调用.尽管构造的时候会先构造父类,再构造子类. 2.类方法是不能用this指针调用. 3.<<表示左移位 >>表示带符号右移位 >>>表示无符号右移 但是没有<<<运算符 4.statement对象是用于执行sql语句的,prepared statement执行预编译的sql,callable statement执行对存储过程的调用. 5.ReentrantLock类,具有与使用synchr