diff --git a/app/src/main/java/com/hippo/widget/FloatingActionButton.java b/app/src/main/java/com/hippo/widget/FloatingActionButton.java index 542cbfa3b..733d79948 100644 --- a/app/src/main/java/com/hippo/widget/FloatingActionButton.java +++ b/app/src/main/java/com/hippo/widget/FloatingActionButton.java @@ -17,24 +17,24 @@ package com.hippo.widget; import android.annotation.TargetApi; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; import android.os.Build; import android.util.AttributeSet; import android.view.View; +import com.hippo.ehviewer.R; import com.hippo.util.UiUtils; import com.hippo.util.ViewUtils; public class FloatingActionButton extends View { - private static final int[] BACKGROUND_ATTR = {android.R.attr.colorBackground}; - private static final int[] DRAWABLE_ATTR = {android.R.attr.drawable}; - private static final int DRAWABLE_WIDTH = UiUtils.dp2pix(24); private GasketDrawer mGasketDrawer; @@ -56,24 +56,25 @@ public class FloatingActionButton extends View { init(context, attrs, defStyleAttr, defStyleRes); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { TypedArray a; - // Background color - a = context.obtainStyledAttributes(attrs, BACKGROUND_ATTR, defStyleAttr, defStyleRes); - int bgColor = a.getColor(0, Color.BLACK); + a = context.obtainStyledAttributes(attrs, R.styleable.FloatingActionButton, defStyleAttr, defStyleRes); + int bgColor = a.getColor(R.styleable.FloatingActionButton_fabColor, Color.BLACK); + mDrawable = a.getDrawable(R.styleable.FloatingActionButton_fabDrawable); a.recycle(); - // Drawable - a = context.obtainStyledAttributes(attrs, DRAWABLE_ATTR, defStyleAttr, defStyleRes); - mDrawable = a.getDrawable(0); - a.recycle(); - - mGasketDrawer = new GasketDrawer(this, bgColor); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mGasketDrawer = new GasketDrawerLollipop(this, bgColor); + } else { + mGasketDrawer = new GasketDrawerOld(this, bgColor); + } } + @Override protected void drawableStateChanged() { + super.drawableStateChanged(); + int[] stateSet = getDrawableState(); mGasketDrawer.onStateChange(stateSet); } @@ -113,12 +114,21 @@ public class FloatingActionButton extends View { invalidate(); } - static class GasketDrawer { + interface GasketDrawer { + void onStateChange(int[] stateSet); + + void draw(Canvas canvas); + + void setColor(int color); + } + + + static class GasketDrawerOld implements GasketDrawer { private static final int SHADOW_RADIOUS = UiUtils.dp2pix(3); private static final int SHADOW_OFFSET_Y = UiUtils.dp2pix(1); private static final int GASKET_PADDING = SHADOW_RADIOUS + SHADOW_OFFSET_Y; // 4dp - private static final int SHADOW_COLOR = 0x8a000000; + private static final int SHADOW_COLOR = 0x43000000; private View mView; @@ -130,7 +140,7 @@ public class FloatingActionButton extends View { private boolean mIsDark; - private GasketDrawer(View view, int color) { + private GasketDrawerOld(View view, int color) { mView = view; mBounds = new RectF(); mColor = color; @@ -143,7 +153,7 @@ public class FloatingActionButton extends View { ViewUtils.removeHardwareAccelerationSupport(mView); } - protected void onStateChange(int[] stateSet) { + public void onStateChange(int[] stateSet) { boolean enabled = false; boolean pressed = false; boolean focused = false; @@ -193,4 +203,57 @@ public class FloatingActionButton extends View { updateColor(); } } + + static class GasketDrawerLollipop implements GasketDrawer { + + private static final int ELEVATION = UiUtils.dp2pix(5); + + private static final int[][] STATES = new int[][]{ + new int[]{-android.R.attr.state_enabled}, + new int[]{android.R.attr.state_pressed}, + new int[]{android.R.attr.state_focused}, + new int[]{} + }; + + private View mView; + private int mColor; + + private GradientDrawable mGradientDrawable; + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public GasketDrawerLollipop(View view, int color) { + mView = view; + mColor = color; + + int darkColor = UiUtils.getDarkerColor(color); + mGradientDrawable = new GradientDrawable(); + mGradientDrawable.setShape(GradientDrawable.OVAL); + mGradientDrawable.setColor(new ColorStateList(STATES, + new int[] {darkColor, darkColor, darkColor, color})); + + mView.setBackground(mGradientDrawable); + mView.setElevation(ELEVATION); + } + + @Override + public void onStateChange(int[] stateSet) { + // Empty + } + + @Override + public void draw(Canvas canvas) { + // Empty + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public void setColor(int color) { + if (mColor != color) { + mColor = color; + int darkColor = UiUtils.getDarkerColor(color); + mGradientDrawable.setColor(new ColorStateList(STATES, + new int[] {darkColor, darkColor, darkColor, color})); + } + } + } } diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 000000000..07f09c32b --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index fe9414a87..19a49b657 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -19,4 +19,9 @@ - \ No newline at end of file + + + + + +