调整 FloatingActionButton

This commit is contained in:
seven332 committed 2014-11-15 19:26:19 +08:00
1 parent 1d22d78e48
commit 13a9b1780c
6 files changed
+219 -42

No files matched your search

-1
View File
@@ -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
+5 -4
View File
@@ -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
+10
View File
@@ -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
View File
@@ -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);
}
}