summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java')
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java121
1 files changed, 121 insertions, 0 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java
new file mode 100644
index 00000000..f02158e9
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ForegroundImageView.java
@@ -0,0 +1,121 @@
+package org.fox.ttrss.util;
+
+// https://gist.github.com/JakeWharton/0a251d67649305d84e8a
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import org.fox.ttrss.R;
+
+public class ForegroundImageView extends ImageView {
+ private Drawable foreground;
+
+ public ForegroundImageView(Context context) {
+ this(context, null);
+ }
+
+ public ForegroundImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ForegroundImageView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundImageView);
+ Drawable foreground = a.getDrawable(R.styleable.ForegroundImageView_android_foreground);
+ if (foreground != null) {
+ setForeground(foreground);
+ }
+ a.recycle();
+ }
+
+ /**
+ * Supply a drawable resource that is to be rendered on top of all of the child
+ * views in the frame layout.
+ *
+ * @param drawableResId The drawable resource to be drawn on top of the children.
+ */
+ public void setForegroundResource(int drawableResId) {
+ setForeground(getContext().getResources().getDrawable(drawableResId));
+ }
+
+ /**
+ * Supply a Drawable that is to be rendered on top of all of the child
+ * views in the frame layout.
+ *
+ * @param drawable The Drawable to be drawn on top of the children.
+ */
+ public void setForeground(Drawable drawable) {
+ if (foreground == drawable) {
+ return;
+ }
+ if (foreground != null) {
+ foreground.setCallback(null);
+ unscheduleDrawable(foreground);
+ }
+
+ foreground = drawable;
+
+ if (drawable != null) {
+ drawable.setCallback(this);
+ if (drawable.isStateful()) {
+ drawable.setState(getDrawableState());
+ }
+ }
+ requestLayout();
+ invalidate();
+ }
+
+ @Override protected boolean verifyDrawable(Drawable who) {
+ return super.verifyDrawable(who) || who == foreground;
+ }
+
+ @Override public void jumpDrawablesToCurrentState() {
+ super.jumpDrawablesToCurrentState();
+ if (foreground != null) foreground.jumpToCurrentState();
+ }
+
+ @Override protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ if (foreground != null && foreground.isStateful()) {
+ foreground.setState(getDrawableState());
+ }
+ }
+
+ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ if (foreground != null) {
+ foreground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
+ invalidate();
+ }
+ }
+
+ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ if (foreground != null) {
+ foreground.setBounds(0, 0, w, h);
+ invalidate();
+ }
+ }
+
+ @Override public void draw(Canvas canvas) {
+ super.draw(canvas);
+
+ if (foreground != null) {
+ foreground.draw(canvas);
+ }
+ }
+
+ @Override public void drawableHotspotChanged(float x, float y) {
+ super.drawableHotspotChanged(x, y);
+
+ if (foreground != null && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ foreground.setHotspot(x, y);
+ }
+ }
+} \ No newline at end of file