110e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes/* 210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * Copyright (C) 2014 The Android Open Source Project 310e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * 410e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 510e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * you may not use this file except in compliance with the License. 610e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * You may obtain a copy of the License at 710e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * 810e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 910e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * 1010e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * Unless required by applicable law or agreed to in writing, software 1110e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 1210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * See the License for the specific language governing permissions and 1410e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * limitations under the License. 1510e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes */ 1610e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 1710e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banespackage android.support.v7.widget; 1810e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 1910e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banesimport android.content.Context; 20b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banesimport android.graphics.Canvas; 218f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viveretteimport android.support.annotation.RequiresApi; 2210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banesimport android.support.v7.appcompat.R; 2310e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banesimport android.util.AttributeSet; 2410e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banesimport android.widget.SeekBar; 2510e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 2610e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes/** 27de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * A {@link SeekBar} which supports compatible features on older versions of the platform. 2810e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * 29de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <p>This will automatically be used when you use {@link SeekBar} in your layouts 30de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * and the top-level activity / dialog is provided by 31de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>. 3210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes * You should only need to manually use this class when writing custom views.</p> 3310e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes */ 3410e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banespublic class AppCompatSeekBar extends SeekBar { 3510e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 3629def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov private final AppCompatSeekBarHelper mAppCompatSeekBarHelper; 3710e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 3810e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes public AppCompatSeekBar(Context context) { 3910e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes this(context, null); 4010e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes } 4110e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 4210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes public AppCompatSeekBar(Context context, AttributeSet attrs) { 4310e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes this(context, attrs, R.attr.seekBarStyle); 4410e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes } 4510e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 4610e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes public AppCompatSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { 4710e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes super(context, attrs, defStyleAttr); 4810e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 494c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes mAppCompatSeekBarHelper = new AppCompatSeekBarHelper(this); 5010e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes mAppCompatSeekBarHelper.loadFromAttributes(attrs, defStyleAttr); 5110e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes } 5210e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes 53b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes @Override 54ad1b0e82100ee31e70040d77bfa4d847b2bf0864Aurimas Liutikas protected synchronized void onDraw(Canvas canvas) { 55b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes super.onDraw(canvas); 56b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes mAppCompatSeekBarHelper.drawTickMarks(canvas); 57b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes } 58b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes 59b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes @Override 60b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes protected void drawableStateChanged() { 61b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes super.drawableStateChanged(); 62b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes mAppCompatSeekBarHelper.drawableStateChanged(); 63b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes } 64b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes 658f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette @RequiresApi(11) 66b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes @Override 67b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes public void jumpDrawablesToCurrentState() { 68b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes super.jumpDrawablesToCurrentState(); 69b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes mAppCompatSeekBarHelper.jumpDrawablesToCurrentState(); 70b19cba1c83a68efb5c18ef74e4e5d376fa166625Chris Banes } 7110e2dbc1ad1c01d2824d921a8b0f070859d6f146Chris Banes} 72