diff options
author | Ruben Brunk <rubenbrunk@google.com> | 2012-12-19 10:47:49 -0800 |
---|---|---|
committer | Ruben Brunk <rubenbrunk@google.com> | 2013-01-11 17:52:36 -0800 |
commit | b146af084f43e6b87ad34ac9bf94b18aa36a46aa (patch) | |
tree | 3674f0a37718e3a6df222af03d8e5ee9380a122b /src/com/android/gallery3d/filtershow/ui | |
parent | 6681d532e7f1fe9971e10ddeae52063bf4ba5e12 (diff) | |
download | android_packages_apps_Snap-b146af084f43e6b87ad34ac9bf94b18aa36a46aa.tar.gz android_packages_apps_Snap-b146af084f43e6b87ad34ac9bf94b18aa36a46aa.tar.bz2 android_packages_apps_Snap-b146af084f43e6b87ad34ac9bf94b18aa36a46aa.zip |
Refactoring button class. Minor bug fixes.
Bug: 7875246
Bug: 7459118
Change-Id: Ic1099a7ae0feeeb16c8be3035f9726805149666e
Diffstat (limited to 'src/com/android/gallery3d/filtershow/ui')
3 files changed, 278 insertions, 73 deletions
diff --git a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java new file mode 100644 index 000000000..c2be85809 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2012 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.ui; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; + +import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.FilterShowActivity; +import com.android.gallery3d.filtershow.filters.ImageFilter; +import com.android.gallery3d.filtershow.filters.ImageFilterBorder; +import com.android.gallery3d.filtershow.filters.ImageFilterDownsample; +import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder; + +public class FilterIconButton extends IconButton implements View.OnClickListener { + private Bitmap mOverlayBitmap = null; + private FilterShowActivity mController = null; + private ImageFilter mImageFilter = null; + private LinearLayout mParentContainer = null; + private View.OnClickListener mListener = null; + + public FilterIconButton(Context context) { + super(context); + } + + public FilterIconButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public FilterIconButton(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public void setup(String text, ImageFilter filter, FilterShowActivity controller, + LinearLayout parent) { + mImageFilter = filter; + mController = controller; + setText(text); + + if (mImageFilter.getOverlayBitmaps() != 0) { + mOverlayBitmap = BitmapFactory.decodeResource(getResources(), + mImageFilter.getOverlayBitmaps()); + } + + mParentContainer = parent; + super.setOnClickListener(this); + invalidate(); + } + + @Override + protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) { + dst = super.drawImage(dst, image, destination); + dst = mImageFilter.iconApply(dst, 1.0f, false); + if (mOverlayBitmap != null) { + dst = super.drawImage(dst, mOverlayBitmap, destination); + } + return dst; + } + + @Override + public void setOnClickListener(View.OnClickListener listener) { + mListener = listener; + } + + @Override + public void onClick(View v) { + if (mController != null && mImageFilter != null) { + if (!isSelected()) { + mController.useFilter(mImageFilter); + mParentContainer.dispatchSetSelected(false); + setSelected(true); + } + } + if (mListener != null && mListener != this) { + mListener.onClick(v); + } + } + + public ImageFilter getImageFilter() { + return mImageFilter; + } +} diff --git a/src/com/android/gallery3d/filtershow/ui/IconButton.java b/src/com/android/gallery3d/filtershow/ui/IconButton.java new file mode 100644 index 000000000..1ebc1abda --- /dev/null +++ b/src/com/android/gallery3d/filtershow/ui/IconButton.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2012 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.ui; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.widget.Button; + +import com.android.gallery3d.R; + +/** + * Class of buttons with both an image icon and text. + */ +public class IconButton extends Button { + + protected Bitmap mImageMirror = null; + protected Bitmap mIcon = null; + + private boolean stale_icon = true; + + public IconButton(Context context) { + this(context, null); + } + + public IconButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public IconButton(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + BitmapDrawable ic = (BitmapDrawable) getCompoundDrawables()[1]; + + if (ic != null) { + mImageMirror = ic.getBitmap(); + } + } + + /** + * Set the image that the button icon will use. + * + * @param image image that icon will be set to before next draw. + */ + public void setIcon(Bitmap image) { + mImageMirror = image; + stale_icon = true; + } + + /** + * Creates and sets button icon. Only call after layout. + * + * @param image bitmap to use as icon + */ + protected boolean makeAndSetIcon(Bitmap image) { + int size = getGoodIconSideSize(); + if (size > 0) { + return setImageIcon(makeImageIcon(image, size, size)); + } + return false; + } + + /** + * Sets icon. + * + * @param image bitmap to set the icon to. + */ + protected boolean setImageIcon(Bitmap image) { + if (image == null) { + return false; + } + mIcon = image; + this.setCompoundDrawablesWithIntrinsicBounds(null, + new BitmapDrawable(getResources(), mIcon), null, null); + return true; + } + + /** + * Generate an icon bitmap from a given bitmap. + * + * @param image bitmap to use as button icon + * @param width icon width + * @param height icon height + * @return the scaled/cropped icon bitmap + */ + protected Bitmap makeImageIcon(Bitmap image, int width, int height) { + Rect destination = new Rect(0, 0, width, height); + Bitmap bmap = Bitmap.createBitmap(width, height, + Bitmap.Config.ARGB_8888); + bmap = drawImage(bmap, image, destination); + return bmap; + } + + /** + * Finds a side length for the (square) icon that fits within the button. + * Only call after layout. + * + * @return icon side length + */ + protected int getGoodIconSideSize() { + Paint p = getPaint(); + Rect bounds = new Rect(); + String s = getText().toString(); + p.getTextBounds(s, 0, s.length(), bounds); + int inner_padding = 2 * getCompoundDrawablePadding(); + int vert = getHeight() - getPaddingTop() - getPaddingBottom() - bounds.height() + - inner_padding; + int horiz = getWidth() - getPaddingLeft() - getPaddingRight() - inner_padding; + return Math.min(vert, horiz); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + stale_icon = true; + } + + @Override + protected void onDraw(Canvas canvas) { + if (stale_icon && mImageMirror != null && mImageMirror.getHeight() > 0 + && mImageMirror.getWidth() > 0) { + stale_icon = !makeAndSetIcon(mImageMirror); + } + super.onDraw(canvas); + } + + // Override this for custom icon generation + protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) { + if (image != null) { + Canvas canvas = new Canvas(dst); + int iw = image.getWidth(); + int ih = image.getHeight(); + int x = 0; + int y = 0; + int size = 0; + Rect source = null; + if (iw > ih) { + size = ih; + x = (int) ((iw - size) / 2.0f); + y = 0; + } else { + size = iw; + x = 0; + y = (int) ((ih - size) / 2.0f); + } + source = new Rect(x, y, x + size, y + size); + canvas.drawBitmap(image, source, destination, new Paint()); + } + return dst; + } + +} diff --git a/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java b/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java deleted file mode 100644 index bb37751bf..000000000 --- a/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2012 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.ui; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.util.AttributeSet; -import android.widget.ImageButton; - -import com.android.gallery3d.R; - -public class ImageButtonTitle extends ImageButton { - private static final String LOGTAG = "ImageButtonTitle"; - private String mText = null; - private static int mTextSize = 24; - private static int mTextPadding = 20; - private static Paint gPaint = new Paint(); - - public static void setTextSize(int value) { - mTextSize = value; - } - - public static void setTextPadding(int value) { - mTextPadding = value; - } - - public void setText(String text) { - mText = text; - } - - public ImageButtonTitle(Context context, AttributeSet attrs) { - super(context, attrs); - TypedArray a = getContext().obtainStyledAttributes( - attrs, R.styleable.ImageButtonTitle); - - mText = a.getString(R.styleable.ImageButtonTitle_android_text); - } - - public String getText(){ - return mText; - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (mText != null) { - gPaint.setARGB(255, 255, 255, 255); - gPaint.setTextSize(mTextSize); - float textWidth = gPaint.measureText(mText); - int x = (int) ((getWidth() - textWidth) / 2); - int y = getHeight() - mTextPadding; - - canvas.drawText(mText, x, y, gPaint); - } - } - -} |