调整 FloatingActionButton
This commit is contained in:
1 parent
1d22d78e48
commit
13a9b1780c
6 files changed
+219
-42
No files matched your search
@@ -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
|
||||
@@ -364,15 +364,16 @@
|
||||
android:listSelector="@android:color/transparent" >
|
||||
</ListView>
|
||||
|
||||
<com.faizmalkani.floatingactionbutton.FloatingActionButton
|
||||
<com.hippo.ehviewer.widget.FloatingActionButton
|
||||
xmlns:auto="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/reply"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
style="@style/FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|right"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
auto:drawable="@drawable/ic_reply" />
|
||||
auto:fabDrawable="@drawable/ic_reply" />
|
||||
</FrameLayout>
|
||||
|
||||
<com.hippo.ehviewer.widget.RefreshTextView
|
||||
|
||||
@@ -84,4 +84,14 @@
|
||||
</attr>
|
||||
</declare-styleable>
|
||||
|
||||
<declare-styleable name="FloatingActionButton">
|
||||
<attr name="fabDrawable" format="integer"/>
|
||||
<attr name="fabColor" format="color"/>
|
||||
<attr name="fabShadowRadius" format="dimension"/>
|
||||
<attr name="fabShadowDx" format="dimension"/>
|
||||
<attr name="fabShadowDy" format="dimension"/>
|
||||
<attr name="fabShadowColor" format="color"/>
|
||||
<attr name="fabDrawableSide" format="dimension"/>
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
||||
+52
-36
@@ -17,30 +17,30 @@
|
||||
<resources xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<style name="ActionBar" parent="@android:style/Widget.Holo.ActionBar">
|
||||
<item name="android:background">@android:color/holo_blue_dark</item>
|
||||
<item name="android:backgroundStacked">@color/tag_bg</item>
|
||||
<item name="android:backgroundSplit">@android:color/holo_blue_dark</item>
|
||||
<item name="android:titleTextStyle">@style/ActionBarTitleFont</item>
|
||||
<item name="@android:background">@android:color/holo_blue_dark</item>
|
||||
<item name="@android:backgroundStacked">@color/tag_bg</item>
|
||||
<item name="@android:backgroundSplit">@android:color/holo_blue_dark</item>
|
||||
<item name="@android:titleTextStyle">@style/ActionBarTitleFont</item>
|
||||
</style>
|
||||
|
||||
<style name="ActionBar.Gallery" parent="@android:style/Widget.Holo.ActionBar">
|
||||
<item name="android:background">@color/background_little_dark</item>
|
||||
<item name="android:backgroundStacked">@color/tag_bg</item>
|
||||
<item name="android:backgroundSplit">@color/background_little_dark</item>
|
||||
<item name="android:titleTextStyle">@style/ActionBarTitleFont.Gallery</item>
|
||||
<item name="@android:background">@color/background_little_dark</item>
|
||||
<item name="@android:backgroundStacked">@color/tag_bg</item>
|
||||
<item name="@android:backgroundSplit">@color/background_little_dark</item>
|
||||
<item name="@android:titleTextStyle">@style/ActionBarTitleFont.Gallery</item>
|
||||
</style>
|
||||
|
||||
<style name="ActionBarTitleFont" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:textColor">@android:color/white</item>
|
||||
<item name="@android:textStyle">bold</item>
|
||||
<item name="@android:textColor">@android:color/white</item>
|
||||
</style>
|
||||
|
||||
<style name="ActionBarTitleFont.Gallery" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
|
||||
<item name="android:textColor">@color/secondary_text_light</item>
|
||||
<item name="@android:textColor">@color/secondary_text_light</item>
|
||||
</style>
|
||||
|
||||
<style name="OverFlow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
|
||||
<item name="android:src">@drawable/ic_action_core_overflow</item>
|
||||
<item name="@android:src">@drawable/ic_action_core_overflow</item>
|
||||
</style>
|
||||
|
||||
<style name="PopupMenu" parent="@android:style/Widget.Holo.Light.ListPopupWindow">
|
||||
@@ -146,29 +146,29 @@
|
||||
|
||||
<!-- Text -->
|
||||
<style name="TextAppearance.CardTitle">
|
||||
<item name="android:textSize">@dimen/text_little_large</item>
|
||||
<item name="@android:textSize">@dimen/text_little_large</item>
|
||||
</style>
|
||||
|
||||
<style name="CardTitle">
|
||||
<item name="@android:textAppearance">@style/TextAppearance.CardTitle</item>
|
||||
<item name="android:ellipsize">end</item>
|
||||
<item name="android:maxLines">2</item>
|
||||
<item name="android:lineSpacingExtra">0sp</item>
|
||||
<item name="@android:ellipsize">end</item>
|
||||
<item name="@android:maxLines">2</item>
|
||||
<item name="@android:lineSpacingExtra">0sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.CardMessage">
|
||||
<item name="android:textColor">@color/secondary_text_dark</item>
|
||||
<item name="@android:textColor">@color/secondary_text_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="CardMessage">
|
||||
<item name="@android:textAppearance">@style/TextAppearance.CardMessage</item>
|
||||
<item name="android:ellipsize">end</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="@android:ellipsize">end</item>
|
||||
<item name="@android:singleLine">true</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.DetailTitle">
|
||||
<item name="android:textSize">@dimen/text_large</item>
|
||||
<item name="android:textColor">@color/primary_text_dark</item>
|
||||
<item name="@android:textSize">@dimen/text_large</item>
|
||||
<item name="@android:textColor">@color/primary_text_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="DetailTitle">
|
||||
@@ -178,8 +178,8 @@
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.DetailSubtitle">
|
||||
<item name="android:textSize">@dimen/text_little_large</item>
|
||||
<item name="android:textColor">@color/secondary_text_dark</item>
|
||||
<item name="@android:textSize">@dimen/text_little_large</item>
|
||||
<item name="@android:textColor">@color/secondary_text_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="DetailSubtitle">
|
||||
@@ -189,15 +189,15 @@
|
||||
</style>
|
||||
|
||||
<style name="TextTag">
|
||||
<item name="android:textSize">@dimen/text_medium</item>
|
||||
<item name="android:textColor">@color/primary_text_light</item>
|
||||
<item name="android:background">@color/background_dark</item>
|
||||
<item name="android:ellipsize">marquee</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:paddingTop">4dp</item>
|
||||
<item name="android:paddingBottom">4dp</item>
|
||||
<item name="android:paddingLeft">8dp</item>
|
||||
<item name="android:paddingRight">8dp</item>
|
||||
<item name="@android:textSize">@dimen/text_medium</item>
|
||||
<item name="@android:textColor">@color/primary_text_light</item>
|
||||
<item name="@android:background">@color/background_dark</item>
|
||||
<item name="@android:ellipsize">marquee</item>
|
||||
<item name="@android:singleLine">true</item>
|
||||
<item name="@android:paddingTop">4dp</item>
|
||||
<item name="@android:paddingBottom">4dp</item>
|
||||
<item name="@android:paddingLeft">8dp</item>
|
||||
<item name="@android:paddingRight">8dp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.SearchCategory">
|
||||
@@ -238,20 +238,36 @@
|
||||
</style>
|
||||
|
||||
<style name="DropDownItem" parent="@android:Widget.DropDownItem">
|
||||
<item name="android:textAppearance">@style/TextAppearance.DropDownItem</item>
|
||||
<item name="android:paddingLeft">8dp</item>
|
||||
<item name="android:paddingRight">8dp</item>
|
||||
<item name="@android:textAppearance">@style/TextAppearance.DropDownItem</item>
|
||||
<item name="@android:paddingLeft">8dp</item>
|
||||
<item name="@android:paddingRight">8dp</item>
|
||||
</style>
|
||||
|
||||
<style name="DropDownItem.Spinner">
|
||||
</style>
|
||||
|
||||
<!-- Dialog -->
|
||||
<style name="FloatingActionButton">
|
||||
<item name="@android:minWidth">60dp</item>
|
||||
<item name="@android:minHeight">60dp</item>
|
||||
<item name="fabShadowRadius">2dp</item>
|
||||
<item name="fabShadowDx">0dp</item>
|
||||
<item name="fabShadowDy">1dp</item>
|
||||
<item name="fabShadowColor">@color/secondary_text_dark</item>
|
||||
<item name="fabDrawableSide">24dp</item>
|
||||
</style>
|
||||
|
||||
<style name="FloatingActionButton.Small">
|
||||
<item name="@android:minWidth">44dp</item>
|
||||
<item name="@android:minHeight">44dp</item>
|
||||
</style>
|
||||
|
||||
<!-- Dialog -->
|
||||
<style name="Dialog" parent="DialogMessage">
|
||||
</style>
|
||||
|
||||
<style name="Dialog.CheckBox">
|
||||
<item name="android:button">@drawable/btn_check_dialog_material</item>
|
||||
<item name="@android:button">@drawable/btn_check_dialog_material</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user