diff --git a/project.properties b/project.properties index fce0b28ee..b84c9a2a3 100644 --- a/project.properties +++ b/project.properties @@ -12,4 +12,3 @@ proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project. # Project target. target=android-21 -android.library.reference.1=..\\..\\code\\FloatingActionButton\\FloatingActionButton diff --git a/res/layout/gallery_detail.xml b/res/layout/gallery_detail.xml index a929bd544..c3645b431 100644 --- a/res/layout/gallery_detail.xml +++ b/res/layout/gallery_detail.xml @@ -364,15 +364,16 @@ android:listSelector="@android:color/transparent" > - + auto:fabDrawable="@drawable/ic_reply" /> + + + + + + + + + + \ No newline at end of file diff --git a/res/values/styles.xml b/res/values/styles.xml index 109e4c22d..faf3c811c 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -17,30 +17,30 @@ + + + + + diff --git a/src/com/hippo/ehviewer/ui/GalleryDetailActivity.java b/src/com/hippo/ehviewer/ui/GalleryDetailActivity.java index 2b7b2052d..3f6c48e6e 100644 --- a/src/com/hippo/ehviewer/ui/GalleryDetailActivity.java +++ b/src/com/hippo/ehviewer/ui/GalleryDetailActivity.java @@ -58,7 +58,6 @@ import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.ViewSwitcher; -import com.faizmalkani.floatingactionbutton.FloatingActionButton; import com.hippo.ehviewer.ImageLoader; import com.hippo.ehviewer.R; import com.hippo.ehviewer.app.MaterialAlertDialog; @@ -89,6 +88,7 @@ import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.ViewUtils; import com.hippo.ehviewer.widget.AutoWrapLayout; import com.hippo.ehviewer.widget.FitWindowView; +import com.hippo.ehviewer.widget.FloatingActionButton; import com.hippo.ehviewer.widget.LinkifyTextView; import com.hippo.ehviewer.widget.LoadImageView; import com.hippo.ehviewer.widget.MaterialProgress; diff --git a/src/com/hippo/ehviewer/widget/FloatingActionButton.java b/src/com/hippo/ehviewer/widget/FloatingActionButton.java new file mode 100644 index 000000000..a427628a4 --- /dev/null +++ b/src/com/hippo/ehviewer/widget/FloatingActionButton.java @@ -0,0 +1,151 @@ +package com.hippo.ehviewer.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.hippo.ehviewer.R; + +public class FloatingActionButton extends View { + + @SuppressWarnings("unused") + private static final String TAG = FloatingActionButton.class.getSimpleName(); + + private final Paint mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint mDrawablePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Bitmap mBitmap; + private int mColor; + private final int mDrawableSide; + private final float mShadowRadius; + private final float mShadowDx; + private final float mShadowDy; + + private int mCircleX; + private int mCircleY; + private int mCircleRadius; + private final Rect mSrc = new Rect(); + private final RectF mDst = new RectF(); + + + public FloatingActionButton(Context context) { + this(context, null); + } + + public FloatingActionButton(Context context, AttributeSet attributeSet) { + this(context, attributeSet, 0); + } + + public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FloatingActionButton); + mDrawableSide = a.getDimensionPixelSize(R.styleable.FloatingActionButton_fabDrawableSide, 72); + mColor = a.getColor(R.styleable.FloatingActionButton_fabColor, Color.WHITE); + mButtonPaint.setStyle(Paint.Style.FILL); + mButtonPaint.setColor(mColor); + mShadowRadius = a.getDimension(R.styleable.FloatingActionButton_fabShadowRadius, 10.0f); + mShadowDx = a.getDimension(R.styleable.FloatingActionButton_fabShadowDx, 0.0f); + mShadowDy = a.getDimension(R.styleable.FloatingActionButton_fabShadowDy, 3.0f); + int shadowColor = a.getColor(R.styleable.FloatingActionButton_fabShadowColor, 0x8a000000); + mButtonPaint.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, shadowColor); + Drawable drawable = a.getDrawable(R.styleable.FloatingActionButton_fabDrawable); + if (drawable != null && drawable instanceof BitmapDrawable) + mBitmap = ((BitmapDrawable) drawable).getBitmap(); + a.recycle(); + + setWillNotDraw(false); + setLayerType(View.LAYER_TYPE_SOFTWARE, null); + } + + public void setColor(int color) { + mColor = color; + mButtonPaint.setColor(mColor); + invalidate(); + } + + public void setDrawable(Drawable drawable) { + mBitmap = ((BitmapDrawable) drawable).getBitmap(); + updateValue(); + invalidate(); + } + + public static int getDefaultSize(int size, int measureSpec) { + int result = size; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + + switch (specMode) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + result = size; + break; + case MeasureSpec.EXACTLY: + result = specSize; + break; + } + return result; + } + + private void updateValue() { + float half = Math.min(getWidth(), getHeight()) / 2; + mCircleX = (int) (half - mShadowDx); + mCircleY = (int) (half - mShadowDy); + mCircleRadius = (int) (half - mShadowRadius); + float halfDrawableSide = mDrawableSide / 2.0f; + if (mBitmap != null) { + mSrc.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); + mDst.set(mCircleX - halfDrawableSide, mCircleY - halfDrawableSide, mCircleX + halfDrawableSide, mCircleY + halfDrawableSide); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), + getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + updateValue(); + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawCircle(mCircleX, mCircleY, mCircleRadius, mButtonPaint); + if (null != mBitmap) + canvas.drawBitmap(mBitmap, mSrc, mDst, mDrawablePaint); + } + + @Override + @SuppressLint("ClickableViewAccessibility") + public boolean onTouchEvent(MotionEvent event) { + int color; + if (event.getAction() == MotionEvent.ACTION_UP) { + color = mColor; + } else { + color = darkenColor(mColor); + } + mButtonPaint.setColor(color); + invalidate(); + return super.onTouchEvent(event); + } + + public static int darkenColor(int color) { + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return Color.HSVToColor(hsv); + } +} \ No newline at end of file