/* * Copyright (C) 2017 The Android Open Source Project * * Licensed 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 at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed 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 and * limitations under the License. */ package com.android.launcher3.graphics; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; /** * Utility class which draws a bitmap by dissecting it into 3 segments and stretching * the middle segment. */ public class NinePatchDrawHelper { // The extra width used for the bitmap. This portion of the bitmap is stretched to match the // width of the draw region. Randomly chosen, any value > 4 will be sufficient. public static final int EXTENSION_PX = 20; private final Rect mSrc = new Rect(); private final RectF mDst = new RectF(); // Enable filtering to always get a nice edge. This avoids jagged line, when bitmap is // translated by half pixel. public final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); /** * Draws the bitmap split into three parts horizontally, with the middle part having width * as {@link #EXTENSION_PX} in the center of the bitmap. */ public void draw(Bitmap bitmap, Canvas canvas, float left, float top, float right) { int height = bitmap.getHeight(); mSrc.top = 0; mSrc.bottom = height; mDst.top = top; mDst.bottom = top + height; draw3Patch(bitmap, canvas, left, right); } /** * Draws the bitmap split horizontally into 3 parts (same as {@link #draw}) and split * vertically into two parts, bottom part of size {@link #EXTENSION_PX} / 2 which is * stretched vertically. */ public void drawVerticallyStretched(Bitmap bitmap, Canvas canvas, float left, float top, float right, float bottom) { draw(bitmap, canvas, left, top, right); // Draw bottom stretched region. int height = bitmap.getHeight(); mSrc.top = height - EXTENSION_PX / 4; mSrc.bottom = height; mDst.top = top + height; mDst.bottom = bottom; draw3Patch(bitmap, canvas, left, right); } private void draw3Patch(Bitmap bitmap, Canvas canvas, float left, float right) { int width = bitmap.getWidth(); int halfWidth = width / 2; // Draw left edge drawRegion(bitmap, canvas, 0, halfWidth, left, left + halfWidth); // Draw right edge drawRegion(bitmap, canvas, halfWidth, width, right - halfWidth, right); // Draw middle stretched region int halfExt = EXTENSION_PX / 4; drawRegion(bitmap, canvas, halfWidth - halfExt, halfWidth + halfExt, left + halfWidth, right - halfWidth); } private void drawRegion(Bitmap bitmap, Canvas c, int srcLeft, int srcRight, float dstLeft, float dstRight) { mSrc.left = srcLeft; mSrc.right = srcRight; mDst.left = dstLeft; mDst.right = dstRight; c.drawBitmap(bitmap, mSrc, mDst, paint); } }