dbcb8674fd
Enable bitmap filter for search box background. This avoids jagged line, when bitmap is translated by half screen pixel. Bug: 77841258 Test: Ran launcher on a device Change-Id: I9293669da5db8be16ebe55ce01ab0e9735932c12
101 lines
3.5 KiB
Java
101 lines
3.5 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|