Android控件默认风格解析之SeekBar
在我們開發的時候常常需要更改原生控件的默認效果,有時候某些控件改起來挺費勁的,比如SeekBar的背景與其ProgressBar的進度粗細或者thumb居中現實與否如果弄錯,都是個大麻煩,我曾經就為thumb的居中顯示問題浪費了很多很多的時間,后來以別的笨拙的辦法解決了,現在重新回來看,決定下決心整一下,看看到底是怎么回事。
我們知道,當我們在寫一個xml布局的時候,只需要簡單的為這個控件指定一個高寬便可以看到它的效果,就像這樣:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context=".MainActivity"tools:showIn="@layout/activity_main"><SeekBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:progress="30"/> </RelativeLayout>預覽效果圖:
我們可以看到這個控件本身是帶有一種風格的,那這個風格在哪里被定義了呢?我們一起來找找:
我們當然需要先去SeeBar的類里面找找有什么關鍵的信息:
我們在SeeBar的重載構造方法中看到一條有用的信息:
public SeekBar(Context context, AttributeSet attrs) {this(context, attrs, com.android.internal.R.attr.seekBarStyle);}原來奧秘就在com.android.internal.R.attr.seekBarStyle的里面,我們找找去,seekBarStyle位于platform_frameworks_base-master\core\res\res\values\themes.xml文件中,在該文件中可以發現它的定義: <item name="seekBarStyle">@style/Widget.SeekBar</item>
看來它是調用了位于style下的Widget.SeekBar風格,我們再去找找: <style name="Widget.SeekBar"><item name="indeterminateOnly">false</item><item name="progressDrawable">@drawable/progress_horizontal</item><item name="indeterminateDrawable">@drawable/progress_horizontal</item><item name="minHeight">20dip</item><item name="maxHeight">20dip</item><item name="thumb">@drawable/seek_thumb</item><item name="thumbOffset">8dip</item><item name="focusable">true</item><item name="mirrorForRtl">true</item></style>
我們找到了它的默認風格配置文件,可以看到它的基本屬性都在這里了,來一條一條解釋一下這些屬性是什么意思:
indeterminateOnly 是否只是用于指示功能,很顯然SeekBar除了指示還有拖拽,所以這里是false
progressDrawable 用于progress進度的背景色
indeterminateDrawable?用于progress指示進度的背景色
minHeight,maxHeight 兩者相等,用于指定進度條的高度
thumb 用于指定滑動按鈕的配置
thumbOffset 用于指定滑動按鈕的偏移量,默認是8dp
好,主要的屬性解釋完,我們貼一下progress_horizontal文件中的內容,看看如何給progressBar配置背景色:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@id/background"android:gravity="center_vertical|fill_horizontal"><shape android:shape="rectangle"android:tint="?attr/colorControlNormal"><size android:height="@dimen/progress_bar_height_material" /><solid android:color="@color/white_disabled_material" /></shape></item><item android:id="@id/secondaryProgress"android:gravity="center_vertical|fill_horizontal"><scale android:scaleWidth="100%"><shape android:shape="rectangle"android:tint="?attr/colorControlActivated"><size android:height="@dimen/progress_bar_height_material" /><solid android:color="@color/white_disabled_material" /></shape></scale></item><item android:id="@id/progress"android:gravity="center_vertical|fill_horizontal"><scale android:scaleWidth="100%"><shape android:shape="rectangle"android:tint="?attr/colorControlActivated"><size android:height="@dimen/progress_bar_height_material" /><solid android:color="@color/white" /></shape></scale></item> </layer-list>這是個標準的布局文件,我們可以看到在它里面定義了這個屬性android:gravity="center_vertical|fill_horizontal",在網上我們經常可以看到各種SeekBar的樣式里面是沒有填寫這個屬性的,我們如果直接使用就會遇到thumb與progress的中心不在同一水平位置。
最后再貼一下標準的seek_thumb文件:
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source ProjectLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. --><!-- This is the thumb on the seek bar. --> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"android:state_window_focused="true"android:drawable="@drawable/seek_thumb_pressed" /><item android:state_focused="true"android:state_window_focused="true"android:drawable="@drawable/seek_thumb_selected" /><item android:state_selected="true"android:state_window_focused="true"android:drawable="@drawable/seek_thumb_selected" /><item android:drawable="@drawable/seek_thumb_normal" /></selector> 我們在寫自定義屬性的時候,只用拷貝這個文件并更改相關的屬性就可以。總結
以上是生活随笔為你收集整理的Android控件默认风格解析之SeekBar的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树(西瓜书学习)
- 下一篇: Theano+Keras开发环境搭建(最