美文网首页AndroidAndroid开发Android技术知识
Android仿酷狗音乐SeekBar——样式篇

Android仿酷狗音乐SeekBar——样式篇

作者: magic5650 | 来源:发表于2016-10-18 12:00 被阅读3570次

    Android仿酷狗音乐SeekBar

    需求:仿酷狗音乐SeekBar

    直接上图,上代码


    1903148-676fcbf2e5048392.png
    1903148-d3e5ab81fa2acd42.png

    ** 难点:用户点击或者移动是SeekBar滑块是改变滑块的图案 **

    先画两种不同状态的滑块Thumb

    平时状态:一个直径为10dp大小的白色的圆

    slider_thumb_normal.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"    
      android:shape="oval">    
      <size    
        android:width="10dp"    
        android:height="10dp" />
      <solid android:color="#ffffffff" />
    </shape>
    

    按下状态:一个直径为10dp大小的白色的圆,背景是半透明的直径为40dp的圆

    slider_thumb_pressed.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 白色前景 -->
        <item android:id="@android:id/secondaryProgress"
            android:gravity="center"
            android:bottom="15dp"
            android:top="15dp"
            android:right="15dp"
            android:left="15dp">
            <shape
                android:shape="oval">
                <size
                    android:width="10dp"
                    android:height="10dp" />
                <solid android:color="#ffffffff" />
            </shape>
        </item>
        <!-- 透明阴影 -->
        <item android:id="@android:id/background"
            android:gravity="center">
            <shape
                android:shape="oval">
                <size
                    android:height="40dp"
                    android:width="40dp" />
                <solid android:color="#96ffffff" />
            </shape>
        </item>
    </layer-list>
    

    画进度条

    (不设置高度,由SeekBar自身控制,SeekBar控件android:layout_height="wrap_content")
    play_seekbar_bg.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>
                <size
                    android:height="2dp" />
                <corners android:radius="5dp"/>
                <solid android:color="#88ffffff" />
            </shape>
        </item>
        <item
            android:id="@android:id/secondaryProgress">
            <clip>
                <shape>
                    <size
                        android:height="2dp" />
                    <corners android:radius="5dp"/>
                    <solid android:color="#88ffffff" />
                </shape>
            </clip>
        </item>
        <item android:id="@android:id/progress">
            <clip>
                <shape>
                    <size
                        android:height="2dp"/>
                    <corners android:radius="5dp"/>
                    <solid android:color="#ffffffff" />
                </shape>
            </clip>
        </item>
    </layer-list>
    

    SeekBar样式xml片段

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp">
            <TextView
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:id="@+id/seekbar_slider_time"
                android:textColor="@color/color_white"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:visibility="invisible" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/seekBar_layout"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/tx_currentTime"
                android:layout_width="40dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/color_white"/>
            <SeekBar
                android:id="@+id/seedBar"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="-20dp"
                android:layout_marginEnd="-20dp"
                android:paddingStart="28dp"
                android:paddingEnd="28dp"
                android:background="@android:color/transparent"
                android:gravity="center"
                android:layout_weight="1"
                android:splitTrack="false"
                android:maxHeight="2dp"
                android:progressDrawable="@drawable/play_seekbar_bg"
                android:thumb="@drawable/slider_thumb_normal" />
            <TextView
                android:id="@+id/tx_maxTime"
                android:layout_width="40dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/color_white"/>
        </LinearLayout>
    

    ** SeekBar样式关键点 **

    • android:maxHeight="2dp"——控制进度条高度
    • 设置SeekBar控件边际,以便在滑块变大是可覆盖左右两边的控件,而不会被遮住
    android:layout_marginStart="-20dp"
    android:layout_marginEnd="-20dp"
    android:paddingStart="28dp"
    android:paddingEnd="28dp"
    
    • android:splitTrack="false"——控制滑块覆盖在进度条的上面
    • android:background="@android:color/transparent"——设置背景透明,去掉滑块变大时的周边光晕
    • android:progressDrawable="@drawable/play_seekbar_bg"——默认进度条
    • android:thumb="@drawable/slider_thumb_normal"——默认滑块

    最关键的地方

    使用SeekBar的setThumb方法动态设置滑块
    代码

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if(fromUser){
                        Seekbar_slider_time.setText(updateCurrentTimeText(progress));
                    }
                    tx_currentTime.setText(updateCurrentTimeText(progress));
                    if(progress == seekBar.getMax()){
                        pauseIcon.setLayoutParams(miss);
                        playIcon.setLayoutParams(show);
                    }
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                    Log.d(TAG,"onStartTrackingTouch");
                    isUserPressThumb = true;
                    Seekbar_slider_time.setVisibility(View.VISIBLE);
                    //设置seekbarThumb相对位置可大于进度条15,保证thumb在变成40dp直径后可以滑动到进度条最末尾
                    seekBar.setThumbOffset(15);
                    seekBar.setThumb(Thumb_pressed);
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    Log.d(TAG,"onStopTrackingTouch");
                    mi.seekTo(seekBar.getProgress());
                    seekBar.setThumbOffset(0);
                    seekBar.setThumb(Thumb_normal);
                    Seekbar_slider_time.setVisibility(View.INVISIBLE);
                    isUserPressThumb = false;
                }
            });
    

    在用户开始按下滑块时onStartTrackingTouch

    //设置seekbarThumb相对位置可大于进度条15,保证thumb在变成40dp直径后可以滑动到进度条最末尾
    seekBar.setThumbOffset(15);
    //改变滑块图案
    seekBar.setThumb(Thumb_pressed);

    在用户按下滑块结束后onStopTrackingTouch,恢复滑块及seekbar高度

    seekBar.setThumbOffset(0);
    seekBar.setThumb(Thumb_normal);

    * 踩坑过程 *

    • 使用selector的xml文件设置SeekBar的android:thumb属性设置滑块 *
      play_seekbar_thumb.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android"    
       android:constantSize="false"    
       android:variablePadding="false">    
       <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/slider_thumb_normal" />    
       <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/slider_thumb_pressed" />    
       <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/slider_thumb_pressed" />    
       <item android:drawable="@drawable/slider_thumb_normal" />
    </selector>
    

    ** 坑:有些手机上按下或者移动滑块,滑块是变大了,但是由于SeekBar高度还是原来的,导致滑块被压扁成椭圆 **

    相关文章

      网友评论

        本文标题:Android仿酷狗音乐SeekBar——样式篇

        本文链接:https://www.haomeiwen.com/subject/taazyttx.html