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