1d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger/* 2d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Copyright (C) 2015 The Android Open Source Project 3d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * 4d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Licensed under the Apache License, Version 2.0 (the "License"); 5d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * you may not use this file except in compliance with the License. 6d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * You may obtain a copy of the License at 7d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * 8d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * http://www.apache.org/licenses/LICENSE-2.0 9d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * 10d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Unless required by applicable law or agreed to in writing, software 11d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * distributed under the License is distributed on an "AS IS" BASIS, 12d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * See the License for the specific language governing permissions and 14d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * limitations under the License. 15d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger */ 16d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 17d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerpackage com.android.camera.ui; 18d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 19d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Canvas; 20d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.ColorFilter; 21d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Paint; 22d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.PixelFormat; 23d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Rect; 24d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.RectF; 25d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.drawable.Drawable; 26d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 27d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger/** 28d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Drawable that takes a {@link RectF} as a screen, and draws around that 29d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * screen to fill margins between the screen and the edge of the {@link Canvas} 30d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * when drawing. 31d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger */ 32d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerpublic class MarginDrawable extends Drawable { 33d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 34d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger private RectF mScreen = new RectF(0, 0, 0, 0); 35d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger private final Paint mPaint; 36d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 37d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public MarginDrawable(int color) { 38d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger super(); 39d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 40d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger mPaint = new Paint(); 41d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger mPaint.setAntiAlias(true); 42d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger mPaint.setColor(color); 43d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 44d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 45d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger /** 46d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Set the screen around which will be drawn margins. If the screen rect 47d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * has no area (zero width or height), no margins will be drawn. 48d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * 49d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * @param screen A {@link RectF} describing the screen dimensions 50d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger */ 51d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public void setScreen(RectF screen) { 52d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger mScreen.set(screen); 53d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger invalidateSelf(); 54d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 55d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 56d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger @Override 57d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public void draw(Canvas canvas) { 58d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger RectF s = mScreen; 59d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger if (s.top < s.bottom && s.left < s.right) { 60d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger Rect cb = canvas.getClipBounds(); 61d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger if (s.top > 0) { 62d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger canvas.drawRect(0, 0, cb.right, s.top + 1, mPaint); 63d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 64d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger if (s.left > 0) { 65d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger canvas.drawRect(0, s.top, s.left + 1, s.bottom, mPaint); 66d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 67d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger if (s.right < cb.right) { 68d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger canvas.drawRect(s.right - 1, s.top, cb.right, s.bottom, mPaint); 69d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 70d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger if (s.bottom < cb.bottom) { 71d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger canvas.drawRect(0, s.bottom - 1, cb.right, cb.bottom, mPaint); 72d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 73d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 74d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 75d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 76d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger @Override 77d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public void setAlpha(int alpha) { 78d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 79d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 80d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger @Override 81d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public void setColorFilter(ColorFilter cf) { 82d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 83d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger 84d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger @Override 85d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger public int getOpacity() { 86d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger return PixelFormat.OPAQUE; 87d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger } 88d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger} 89