Loading res/layout/filtershow_category_panel_new.xml +5 −24 Original line number Diff line number Diff line Loading @@ -39,29 +39,10 @@ </HorizontalScrollView> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ImageButton <com.android.gallery3d.filtershow.category.IconView android:id="@+id/addButton" android:layout_width="@dimen/category_panel_height" android:layout_height="@dimen/category_panel_height" android:src="@drawable/filtershow_add" style="?android:attr/borderlessButtonStyle" android:scaleType="fitCenter" android:padding="16dp" android:layout_marginBottom="6dp" android:layout_gravity="center"/> <TextView android:id="@+id/addButtonText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_gravity="bottom|center"/> </FrameLayout> android:src="@drawable/filtershow_add"/> </LinearLayout> No newline at end of file src/com/android/gallery3d/filtershow/category/Action.java +4 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,10 @@ public class Action implements RenderingRequestCaller { this(context, representation, CROP_VIEW); } public int getType() { return mType; } public FilterRepresentation getRepresentation() { return mRepresentation; } Loading src/com/android/gallery3d/filtershow/category/CategoryPanel.java +3 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading src/com/android/gallery3d/filtershow/category/CategoryView.java +17 −97 Original line number Diff line number Diff line Loading @@ -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"; Loading @@ -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; Loading @@ -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)); Loading @@ -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; } return null; if (mAction.getType() == Action.CROP_VIEW) { return true; } 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(); setBitmap(mAction.getImage()); } } super.onDraw(canvas); 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()), getWidth(), getHeight(), mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint); } } } 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()); } } 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(); Loading @@ -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); Loading src/com/android/gallery3d/filtershow/category/IconView.java 0 → 100644 +229 −0 Original line number Diff line number Diff line /* * 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()); } } Loading
res/layout/filtershow_category_panel_new.xml +5 −24 Original line number Diff line number Diff line Loading @@ -39,29 +39,10 @@ </HorizontalScrollView> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ImageButton <com.android.gallery3d.filtershow.category.IconView android:id="@+id/addButton" android:layout_width="@dimen/category_panel_height" android:layout_height="@dimen/category_panel_height" android:src="@drawable/filtershow_add" style="?android:attr/borderlessButtonStyle" android:scaleType="fitCenter" android:padding="16dp" android:layout_marginBottom="6dp" android:layout_gravity="center"/> <TextView android:id="@+id/addButtonText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_gravity="bottom|center"/> </FrameLayout> android:src="@drawable/filtershow_add"/> </LinearLayout> No newline at end of file
src/com/android/gallery3d/filtershow/category/Action.java +4 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,10 @@ public class Action implements RenderingRequestCaller { this(context, representation, CROP_VIEW); } public int getType() { return mType; } public FilterRepresentation getRepresentation() { return mRepresentation; } Loading
src/com/android/gallery3d/filtershow/category/CategoryPanel.java +3 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading
src/com/android/gallery3d/filtershow/category/CategoryView.java +17 −97 Original line number Diff line number Diff line Loading @@ -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"; Loading @@ -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; Loading @@ -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)); Loading @@ -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; } return null; if (mAction.getType() == Action.CROP_VIEW) { return true; } 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(); setBitmap(mAction.getImage()); } } super.onDraw(canvas); 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()), getWidth(), getHeight(), mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint); } } } 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()); } } 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(); Loading @@ -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); Loading
src/com/android/gallery3d/filtershow/category/IconView.java 0 → 100644 +229 −0 Original line number Diff line number Diff line /* * 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()); } }