CircularBorderDrawableLollipop.java revision 80de0674c28a2bd9ade11f24a3b0e46ea83b6847
180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes/* 280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Copyright (C) 2015 The Android Open Source Project 380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * 480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * you may not use this file except in compliance with the License. 680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * You may obtain a copy of the License at 780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * 880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * 1080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Unless required by applicable law or agreed to in writing, software 1180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 1280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * See the License for the specific language governing permissions and 1480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * limitations under the License. 1580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes */ 1680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 1780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banespackage android.support.design.widget; 1880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 1980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 2080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.content.res.ColorStateList; 2180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.Canvas; 2280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.Color; 2380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.PorterDuff; 2480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.PorterDuffColorFilter; 2580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 2680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes/** 2780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Lollipop version of {@link CircularBorderDrawable} which accepts tint calls. 2880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes */ 2980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesclass CircularBorderDrawableLollipop extends CircularBorderDrawable { 3080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 3180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes private ColorStateList mTint; 3280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes private PorterDuff.Mode mTintMode = PorterDuff.Mode.SRC_IN; 3380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes private PorterDuffColorFilter mTintFilter; 3480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 3580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes @Override 3680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes public void draw(Canvas canvas) { 3780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes boolean clearColorFilter; 3880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes if (mTintFilter != null && mPaint.getColorFilter() == null) { 3980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mPaint.setColorFilter(mTintFilter); 4080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes clearColorFilter = true; 4180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } else { 4280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes clearColorFilter = false; 4380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 4480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 4580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes super.draw(canvas); 4680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 4780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes if (clearColorFilter) { 4880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mPaint.setColorFilter(null); 4980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 5080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 5180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 5280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes @Override 5380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes public void setTintList(ColorStateList tint) { 5480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mTint = tint; 5580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mTintFilter = updateTintFilter(tint, mTintMode); 5680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes invalidateSelf(); 5780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 5880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 5980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes @Override 6080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes public void setTintMode(PorterDuff.Mode tintMode) { 6180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mTintMode = tintMode; 6280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mTintFilter = updateTintFilter(mTint, tintMode); 6380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes invalidateSelf(); 6480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 6580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 6680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes /** 6780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Ensures the tint filter is consistent with the current tint color and 6880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * mode. 6980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes */ 7080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes private PorterDuffColorFilter updateTintFilter(ColorStateList tint, PorterDuff.Mode tintMode) { 7180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes if (tint == null || tintMode == null) { 7280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes return null; 7380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 7480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 7580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes final int color = tint.getColorForState(getState(), Color.TRANSPARENT); 7680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes return new PorterDuffColorFilter(color, tintMode); 7780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 7880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes} 79