diff options
author | nicolasroard <nicolasroard@google.com> | 2013-08-13 10:30:06 -0700 |
---|---|---|
committer | nicolasroard <nicolasroard@google.com> | 2013-08-13 10:36:25 -0700 |
commit | a0cd22d21474c112ad78b011fbd6f0be977400e6 (patch) | |
tree | 72c9a5e6e1e6e8230d18575ce0ec0a182d7ca7e9 /src/com/android/gallery3d/filtershow/category | |
parent | c31d762d7630f2e5edd451ce5ddb200cf5743ee4 (diff) | |
download | android_packages_apps_Gallery2-a0cd22d21474c112ad78b011fbd6f0be977400e6.tar.gz android_packages_apps_Gallery2-a0cd22d21474c112ad78b011fbd6f0be977400e6.tar.bz2 android_packages_apps_Gallery2-a0cd22d21474c112ad78b011fbd6f0be977400e6.zip |
Fix icons rendering to be consistent
Change-Id: Ie9384df9a34a39311dfe7ccc1cff1250d2f3918e
Diffstat (limited to 'src/com/android/gallery3d/filtershow/category')
4 files changed, 253 insertions, 102 deletions
diff --git a/src/com/android/gallery3d/filtershow/category/Action.java b/src/com/android/gallery3d/filtershow/category/Action.java index 332ca18b0..d0cfffd35 100644 --- a/src/com/android/gallery3d/filtershow/category/Action.java +++ b/src/com/android/gallery3d/filtershow/category/Action.java @@ -58,6 +58,10 @@ public class Action implements RenderingRequestCaller { this(context, representation, CROP_VIEW); } + public int getType() { + return mType; + } + public FilterRepresentation getRepresentation() { return mRepresentation; } diff --git a/src/com/android/gallery3d/filtershow/category/CategoryPanel.java b/src/com/android/gallery3d/filtershow/category/CategoryPanel.java index 0dfe7cb3c..302f021d7 100644 --- a/src/com/android/gallery3d/filtershow/category/CategoryPanel.java +++ b/src/com/android/gallery3d/filtershow/category/CategoryPanel.java @@ -37,8 +37,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener { private int mCurrentAdapter = MainPanel.LOOKS; private CategoryAdapter mAdapter; - private ImageButton mAddButton; - private TextView mAddButtonText; + private IconView mAddButton; public void setAdapter(int value) { mCurrentAdapter = value; @@ -114,8 +113,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener { mAdapter.setContainer(panel); } - mAddButton = (ImageButton) main.findViewById(R.id.addButton); - mAddButtonText = (TextView) main.findViewById(R.id.addButtonText); + mAddButton = (IconView) main.findViewById(R.id.addButton); if (mAddButton != null) { mAddButton.setOnClickListener(this); updateAddButtonVisibility(); @@ -141,7 +139,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener { if (activity.isShowingImageStatePanel() && mAdapter.showAddButton()) { mAddButton.setVisibility(View.VISIBLE); if (mAdapter != null) { - mAddButtonText.setText(mAdapter.getAddButtonText()); + mAddButton.setText(mAdapter.getAddButtonText()); } } else { mAddButton.setVisibility(View.GONE); diff --git a/src/com/android/gallery3d/filtershow/category/CategoryView.java b/src/com/android/gallery3d/filtershow/category/CategoryView.java index dc2b63a89..cb72bc813 100644 --- a/src/com/android/gallery3d/filtershow/category/CategoryView.java +++ b/src/com/android/gallery3d/filtershow/category/CategoryView.java @@ -23,16 +23,13 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; -import android.graphics.Typeface; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.FilterShowActivity; -import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.ui.SelectionRenderer; -public class CategoryView extends View +public class CategoryView extends IconView implements View.OnClickListener, SwipableView{ private static final String LOGTAG = "CategoryView"; @@ -40,17 +37,11 @@ public class CategoryView extends View public static final int HORIZONTAL = 1; private Paint mPaint = new Paint(); private Action mAction; - private Rect mTextBounds = new Rect(); - private int mMargin = 16; - private int mTextSize = 32; - private int mTextColor; - private int mBackgroundColor; private Paint mSelectPaint; CategoryAdapter mAdapter; private int mSelectionStroke; private Paint mBorderPaint; private int mBorderStroke; - private int mOrientation = VERTICAL; private float mStartTouchY = 0; private float mDeleteSlope = 20; @@ -58,11 +49,7 @@ public class CategoryView extends View super(context); setOnClickListener(this); Resources res = getResources(); - mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background); - mTextColor = res.getColor(R.color.filtershow_categoryview_text); mSelectionStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin); - mTextSize = res.getDimensionPixelSize(R.dimen.category_panel_text_size); - mMargin = res.getDimensionPixelOffset(R.dimen.category_panel_margin); mSelectPaint = new Paint(); mSelectPaint.setStyle(Paint.Style.FILL); mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection)); @@ -71,103 +58,40 @@ public class CategoryView extends View mBorderStroke = mSelectionStroke / 3; } - private void computeTextPosition(String text) { - if (text == null) { - return; - } - mPaint.setTextSize(mTextSize); - if (mOrientation == VERTICAL) { - text = text.toUpperCase(); - // TODO: set this in xml - mPaint.setTypeface(Typeface.DEFAULT_BOLD); - } - mPaint.getTextBounds(text, 0, text.length(), mTextBounds); - } - - public void drawText(Canvas canvas, String text) { - if (text == null) { - return; - } - float textWidth = mPaint.measureText(text); - int x = (int) (canvas.getWidth() - textWidth - mMargin); - if (mOrientation == HORIZONTAL) { - x = (int) ((canvas.getWidth() - textWidth) / 2.0f); - } - if (x < 0) { - // If the text takes more than the view width, - // justify to the left. - x = mMargin; - } - int y = canvas.getHeight() - mMargin; - canvas.drawText(text, x, y, mPaint); - } - @Override - public CharSequence getContentDescription () { - if (mAction != null) { - return mAction.getName(); + public boolean isHalfImage() { + if (mAction == null) { + return false; + } + if (mAction.getType() == Action.CROP_VIEW) { + return true; } - return null; + return false; } - @Override public void onDraw(Canvas canvas) { - canvas.drawColor(mBackgroundColor); if (mAction != null) { - mPaint.reset(); - mPaint.setAntiAlias(true); - computeTextPosition(mAction.getName()); if (mAction.getImage() == null) { - mAction.setImageFrame(new Rect(0, 0, getWidth(), getHeight()), mOrientation); + mAction.setImageFrame(new Rect(0, 0, getWidth(), getHeight()), getOrientation()); } else { - Bitmap bitmap = mAction.getImage(); - canvas.save(); - Rect clipRect = new Rect(mSelectionStroke, mSelectionStroke, - getWidth() - mSelectionStroke, - getHeight() - 2* mMargin - mTextSize); - int offsetx = 0; - int offsety = 0; - if (mOrientation == HORIZONTAL) { - canvas.clipRect(clipRect); - offsetx = - (bitmap.getWidth() - clipRect.width()) / 2; - offsety = - (bitmap.getHeight() - clipRect.height()) / 2; - } - canvas.drawBitmap(bitmap, offsetx, offsety, mPaint); - canvas.restore(); - if (mAdapter.isSelected(this)) { - if (mOrientation == HORIZONTAL) { - SelectionRenderer.drawSelection(canvas, 0, 0, - getWidth(), getHeight() - mMargin - mTextSize, - mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint); - } else { - SelectionRenderer.drawSelection(canvas, 0, 0, - Math.min(bitmap.getWidth(), getWidth()), - Math.min(bitmap.getHeight(), getHeight()), - mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint); - } - } + setBitmap(mAction.getImage()); } - mPaint.setColor(mBackgroundColor); - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(3); - drawText(canvas, mAction.getName()); - mPaint.setColor(mTextColor); - mPaint.setStyle(Paint.Style.FILL); - mPaint.setStrokeWidth(1); - drawText(canvas, mAction.getName()); + } + super.onDraw(canvas); + if (mAdapter.isSelected(this)) { + SelectionRenderer.drawSelection(canvas, 0, 0, + getWidth(), getHeight(), + mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint); } } public void setAction(Action action, CategoryAdapter adapter) { mAction = action; + setText(mAction.getName()); mAdapter = adapter; invalidate(); } - public FilterRepresentation getRepresentation() { - return mAction.getRepresentation(); - } - @Override public void onClick(View view) { FilterShowActivity activity = (FilterShowActivity) getContext(); @@ -175,10 +99,6 @@ public class CategoryView extends View mAdapter.setSelected(this); } - public void setOrientation(int orientation) { - mOrientation = orientation; - } - @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); diff --git a/src/com/android/gallery3d/filtershow/category/IconView.java b/src/com/android/gallery3d/filtershow/category/IconView.java new file mode 100644 index 000000000..5d2aacfa5 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/category/IconView.java @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2013 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.gallery3d.filtershow.category; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.View; +import com.android.gallery3d.R; + +public class IconView extends View { + + public static final int VERTICAL = 0; + public static final int HORIZONTAL = 1; + + private Paint mPaint = new Paint(); + private int mTextColor; + private int mBackgroundColor; + private int mMargin = 16; + private int mOrientation = HORIZONTAL; + private int mTextSize = 32; + private Rect mTextBounds = new Rect(); + private Bitmap mBitmap; + private Rect mBitmapBounds; + private String mText; + private boolean mUseOnlyDrawable = false; + + public IconView(Context context, AttributeSet attrs) { + super(context, attrs); + setup(context); + int bitmapRsc = attrs.getAttributeResourceValue( + "http://schemas.android.com/apk/res/android", "src", 0); + Resources res = context.getResources(); + Bitmap bitmap = BitmapFactory.decodeStream(res.openRawResource(bitmapRsc)); + mUseOnlyDrawable = true; + setBitmap(bitmap); + } + + public IconView(Context context) { + super(context); + setup(context); + } + + private void setup(Context context) { + Resources res = getResources(); + mTextColor = res.getColor(R.color.filtershow_categoryview_text); + mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background); + mMargin = res.getDimensionPixelOffset(R.dimen.category_panel_margin); + mTextSize = res.getDimensionPixelSize(R.dimen.category_panel_text_size); + } + + protected void computeTextPosition(String text) { + if (text == null) { + return; + } + mPaint.setTextSize(mTextSize); + if (getOrientation() == VERTICAL) { + text = text.toUpperCase(); + // TODO: set this in xml + mPaint.setTypeface(Typeface.DEFAULT_BOLD); + } + mPaint.getTextBounds(text, 0, text.length(), mTextBounds); + } + + protected void drawText(Canvas canvas, String text) { + if (text == null) { + return; + } + float textWidth = mPaint.measureText(text); + int x = (int) (canvas.getWidth() - textWidth - 2*mMargin); + if (mOrientation == HORIZONTAL) { + x = (int) ((canvas.getWidth() - textWidth) / 2.0f); + } + if (x < 0) { + // If the text takes more than the view width, + // justify to the left. + x = mMargin; + } + int y = canvas.getHeight() - 2*mMargin; + canvas.drawText(text, x, y, mPaint); + } + + protected void drawOutlinedText(Canvas canvas, String text) { + mPaint.setColor(getBackgroundColor()); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(3); + drawText(canvas, text); + mPaint.setColor(getTextColor()); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setStrokeWidth(1); + drawText(canvas, text); + } + + public int getOrientation() { + return mOrientation; + } + + public void setOrientation(int orientation) { + mOrientation = orientation; + } + + public int getMargin() { + return mMargin; + } + + public int getTextSize() { + return mTextSize; + } + + public int getTextColor() { + return mTextColor; + } + + public int getBackgroundColor() { + return mBackgroundColor; + } + + public void setText(String text) { + mText = text; + } + + public String getText() { + return mText; + } + + public void setBitmap(Bitmap bitmap) { + mBitmap = bitmap; + } + + public Rect getBitmapBounds() { + return mBitmapBounds; + } + + @Override + public CharSequence getContentDescription () { + return mText; + } + + public boolean isHalfImage() { + return false; + } + + public void computeBitmapBounds() { + if (mUseOnlyDrawable) { + mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2, + getHeight() - mTextSize - 2*mMargin); + } else { + if (getOrientation() == VERTICAL && isHalfImage()) { + mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth()/2, getHeight()); + } else { + mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2, getHeight()); + } + } + } + + @Override + public void onDraw(Canvas canvas) { + mPaint.reset(); + mPaint.setAntiAlias(true); + canvas.drawColor(mBackgroundColor); + computeBitmapBounds(); + computeTextPosition(getText()); + if (mBitmap != null) { + canvas.save(); + canvas.clipRect(mBitmapBounds); + Matrix m = new Matrix(); + if (mUseOnlyDrawable) { + mPaint.setFilterBitmap(true); + m.setRectToRect(new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()), + new RectF(mBitmapBounds), Matrix.ScaleToFit.CENTER); + } else { + float scaleWidth = mBitmapBounds.width() / (float) mBitmap.getWidth(); + float scaleHeight = mBitmapBounds.height() / (float) mBitmap.getHeight(); + float scale = Math.max(scaleWidth, scaleHeight); + float dx = (mBitmapBounds.width() - (mBitmap.getWidth() * scale)) / 2f; + float dy = (mBitmapBounds.height() - (mBitmap.getHeight() * scale)) / 2f; + dx += mBitmapBounds.left; + dy += mBitmapBounds.top; + m.postScale(scale, scale); + m.postTranslate(dx, dy); + } + + canvas.drawBitmap(mBitmap, m, mPaint); + canvas.restore(); + } + + if (!mUseOnlyDrawable) { + int startColor = Color.argb(0, 0, 0, 0); + int endColor = Color.argb(200, 0, 0, 0); + float start = getHeight() - 2 * mMargin - 2 * mTextSize; + float end = getHeight(); + Shader shader = new LinearGradient(0, start, 0, end, startColor, + endColor, Shader.TileMode.CLAMP); + mPaint.setShader(shader); + float startGradient = 0; + if (getOrientation() == VERTICAL && isHalfImage()) { + startGradient = getWidth()/2; + } + canvas.drawRect(new RectF(startGradient, start, getWidth(), end), mPaint); + mPaint.setShader(null); + } + drawOutlinedText(canvas, getText()); + } +} |