1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.filtershow.category;
18 
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.graphics.Bitmap;
22 import android.graphics.BitmapFactory;
23 import android.graphics.Canvas;
24 import android.graphics.Color;
25 import android.graphics.LinearGradient;
26 import android.graphics.Matrix;
27 import android.graphics.Paint;
28 import android.graphics.Rect;
29 import android.graphics.RectF;
30 import android.graphics.Shader;
31 import android.graphics.Typeface;
32 import android.util.AttributeSet;
33 import android.view.View;
34 import com.android.gallery3d.R;
35 
36 public class IconView extends View {
37 
38     public static final int VERTICAL = 0;
39     public static final int HORIZONTAL = 1;
40 
41     private Paint mPaint = new Paint();
42     private int mTextColor;
43     private int mBackgroundColor;
44     private int mMargin = 16;
45     private int mOrientation = HORIZONTAL;
46     private int mTextSize = 32;
47     private Rect mTextBounds = new Rect();
48     private Bitmap mBitmap;
49     private Rect mBitmapBounds;
50     private String mText;
51     private boolean mUseOnlyDrawable = false;
52 
IconView(Context context, AttributeSet attrs)53     public IconView(Context context, AttributeSet attrs) {
54         super(context, attrs);
55         setup(context);
56         int bitmapRsc = attrs.getAttributeResourceValue(
57                 "http://schemas.android.com/apk/res/android", "src", 0);
58         Resources res = context.getResources();
59         Bitmap bitmap = BitmapFactory.decodeStream(res.openRawResource(bitmapRsc));
60         setBitmap(bitmap);
61         setUseOnlyDrawable(true);
62     }
63 
IconView(Context context)64     public IconView(Context context) {
65         super(context);
66         setup(context);
67     }
68 
setup(Context context)69     private void setup(Context context) {
70         Resources res = getResources();
71         mTextColor = res.getColor(R.color.filtershow_categoryview_text);
72         mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background);
73         mMargin = res.getDimensionPixelOffset(R.dimen.category_panel_margin);
74         mTextSize = res.getDimensionPixelSize(R.dimen.category_panel_text_size);
75     }
76 
computeTextPosition(String text)77     protected void computeTextPosition(String text) {
78         if (text == null) {
79             return;
80         }
81         mPaint.setTextSize(mTextSize);
82         if (getOrientation() == VERTICAL) {
83             text = text.toUpperCase();
84             // TODO: set this in xml
85             mPaint.setTypeface(Typeface.DEFAULT_BOLD);
86         }
87         mPaint.getTextBounds(text, 0, text.length(), mTextBounds);
88     }
89 
needsCenterText()90     public boolean needsCenterText() {
91         if (mOrientation == HORIZONTAL) {
92             return true;
93         }
94         return false;
95     }
96 
drawText(Canvas canvas, String text)97     protected void drawText(Canvas canvas, String text) {
98         if (text == null) {
99             return;
100         }
101         float textWidth = mPaint.measureText(text);
102         int x = (int) (canvas.getWidth() - textWidth - 2*mMargin);
103         if (needsCenterText()) {
104             x = (int) ((canvas.getWidth() - textWidth) / 2.0f);
105         }
106         if (x < 0) {
107             // If the text takes more than the view width,
108             // justify to the left.
109             x = mMargin;
110         }
111         int y = canvas.getHeight() - 2*mMargin;
112         canvas.drawText(text, x, y, mPaint);
113     }
114 
drawOutlinedText(Canvas canvas, String text)115     protected void drawOutlinedText(Canvas canvas, String text) {
116         mPaint.setColor(getBackgroundColor());
117         mPaint.setStyle(Paint.Style.STROKE);
118         mPaint.setStrokeWidth(3);
119         drawText(canvas, text);
120         mPaint.setColor(getTextColor());
121         mPaint.setStyle(Paint.Style.FILL);
122         mPaint.setStrokeWidth(1);
123         drawText(canvas, text);
124     }
125 
getOrientation()126     public int getOrientation() {
127         return mOrientation;
128     }
129 
setOrientation(int orientation)130     public void setOrientation(int orientation) {
131         mOrientation = orientation;
132     }
133 
getMargin()134     public int getMargin() {
135         return mMargin;
136     }
137 
getTextSize()138     public int getTextSize() {
139         return mTextSize;
140     }
141 
getTextColor()142     public int getTextColor() {
143         return mTextColor;
144     }
145 
getBackgroundColor()146     public int getBackgroundColor() {
147         return mBackgroundColor;
148     }
149 
setText(String text)150     public void setText(String text) {
151         mText = text;
152     }
153 
getText()154     public String getText() {
155         return mText;
156     }
157 
setBitmap(Bitmap bitmap)158     public void setBitmap(Bitmap bitmap) {
159         mBitmap = bitmap;
160     }
161 
setUseOnlyDrawable(boolean value)162     public void setUseOnlyDrawable(boolean value) {
163         mUseOnlyDrawable = value;
164     }
165 
getBitmapBounds()166     public Rect getBitmapBounds() {
167         return mBitmapBounds;
168     }
169 
170     @Override
getContentDescription()171     public CharSequence getContentDescription () {
172         return mText;
173     }
174 
isHalfImage()175     public boolean isHalfImage() {
176         return false;
177     }
178 
computeBitmapBounds()179     public void computeBitmapBounds() {
180         if (mUseOnlyDrawable) {
181             mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2,
182                     getHeight() - mTextSize - 2*mMargin);
183         } else {
184             if (getOrientation() == VERTICAL && isHalfImage()) {
185                 mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth()/2, getHeight());
186             } else {
187                 mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2, getHeight());
188             }
189         }
190     }
191 
192     @Override
onDraw(Canvas canvas)193     public void onDraw(Canvas canvas) {
194         mPaint.reset();
195         mPaint.setAntiAlias(true);
196         mPaint.setFilterBitmap(true);
197         canvas.drawColor(mBackgroundColor);
198         computeBitmapBounds();
199         computeTextPosition(getText());
200         if (mBitmap != null) {
201             canvas.save();
202             canvas.clipRect(mBitmapBounds);
203             Matrix m = new Matrix();
204             if (mUseOnlyDrawable) {
205                 mPaint.setFilterBitmap(true);
206                 m.setRectToRect(new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()),
207                         new RectF(mBitmapBounds), Matrix.ScaleToFit.CENTER);
208             } else {
209                 float scaleWidth = mBitmapBounds.width() / (float) mBitmap.getWidth();
210                 float scaleHeight = mBitmapBounds.height() / (float) mBitmap.getHeight();
211                 float scale = Math.max(scaleWidth, scaleHeight);
212                 float dx = (mBitmapBounds.width() - (mBitmap.getWidth() * scale)) / 2f;
213                 float dy = (mBitmapBounds.height() - (mBitmap.getHeight() * scale)) / 2f;
214                 dx += mBitmapBounds.left;
215                 dy += mBitmapBounds.top;
216                 m.postScale(scale, scale);
217                 m.postTranslate(dx, dy);
218             }
219 
220             canvas.drawBitmap(mBitmap, m, mPaint);
221             canvas.restore();
222         }
223 
224         if (!mUseOnlyDrawable) {
225             int startColor = Color.argb(0, 0, 0, 0);
226             int endColor = Color.argb(200, 0, 0, 0);
227             float start = getHeight() - 2 * mMargin - 2 * mTextSize;
228             float end = getHeight();
229             Shader shader = new LinearGradient(0, start, 0, end, startColor,
230                     endColor, Shader.TileMode.CLAMP);
231             mPaint.setShader(shader);
232             float startGradient = 0;
233             if (getOrientation() == VERTICAL && isHalfImage()) {
234                 startGradient = getWidth()/2;
235             }
236             canvas.drawRect(new RectF(startGradient, start, getWidth(), end), mPaint);
237             mPaint.setShader(null);
238         }
239         drawOutlinedText(canvas, getText());
240     }
241 }
242