14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/* 24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2015 The Android Open Source Project 34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License. 64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at 74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and 144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License. 154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage android.support.design.widget; 184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.Matrix; 204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.Rect; 214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.RectF; 224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.View; 234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.ViewGroup; 244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.ViewParent; 254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaclass ViewGroupUtilsHoneycomb { 274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private static final ThreadLocal<Matrix> sMatrix = new ThreadLocal<>(); 28422643669a44d08ca8b22a73286fae988a288b0eDaisuke Miyakawa private static final ThreadLocal<RectF> sRectF = new ThreadLocal<>(); 294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private static final Matrix IDENTITY = new Matrix(); 304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public static void offsetDescendantRect(ViewGroup group, View child, Rect rect) { 3295e66b00988bc16ecc17df31e47c873b2554b8ccinshik Matrix m = sMatrix.get(); 334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (m == null) { 344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa m = new Matrix(); 354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa sMatrix.set(m); 364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 378d1f50f582dc384a164a42657c35187b0226bcc3Chiao Cheng m.set(IDENTITY); 388d1f50f582dc384a164a42657c35187b0226bcc3Chiao Cheng } 394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa offsetDescendantMatrix(group, child, m); 414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa RectF rectF = sRectF.get(); 434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (rectF == null) { 444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa rectF = new RectF(); 454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa rectF.set(rect); 474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa m.mapRect(rectF); 484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa rect.set((int) (rectF.left + 0.5f), (int) (rectF.top + 0.5f), 494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa (int) (rectF.right + 0.5f), (int) (rectF.bottom + 0.5f)); 504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa static void offsetDescendantMatrix(ViewParent target, View view, Matrix m) { 534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final ViewParent parent = view.getParent(); 544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (parent instanceof View && parent != target) { 554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final View vp = (View) parent; 564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa offsetDescendantMatrix(target, vp, m); 574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa m.preTranslate(-vp.getScrollX(), -vp.getScrollY()); 584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa m.preTranslate(view.getLeft(), view.getTop()); 614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!view.getMatrix().isIdentity()) { 634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa m.preConcat(view.getMatrix()); 644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa} 674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa