From c0acbe816af779cafddeae0bc94fdd98d5af309b Mon Sep 17 00:00:00 2001 From: seven332 Date: Wed, 26 Nov 2014 17:57:18 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BB=E7=95=8C=E9=9D=A2=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=AE=E5=BA=A6=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/layout/gl_root_group.xml | 5 ++ .../hippo/ehviewer/drawable/OvalDrawable.java | 10 ++- .../hippo/ehviewer/gallery/GalleryView.java | 32 ++++++- .../gallery/ui/GestureRecognizer.java | 15 ++-- .../hippo/ehviewer/ui/GalleryActivity.java | 84 ++++++++++++------- src/com/hippo/ehviewer/util/Config.java | 8 ++ src/com/hippo/ehviewer/widget/ColorView.java | 59 +++++++++++++ 7 files changed, 167 insertions(+), 46 deletions(-) create mode 100644 src/com/hippo/ehviewer/widget/ColorView.java diff --git a/res/layout/gl_root_group.xml b/res/layout/gl_root_group.xml index b633d911f..d3400d20f 100644 --- a/res/layout/gl_root_group.xml +++ b/res/layout/gl_root_group.xml @@ -85,4 +85,9 @@ + + \ No newline at end of file diff --git a/src/com/hippo/ehviewer/drawable/OvalDrawable.java b/src/com/hippo/ehviewer/drawable/OvalDrawable.java index b062cd717..fb610fe11 100644 --- a/src/com/hippo/ehviewer/drawable/OvalDrawable.java +++ b/src/com/hippo/ehviewer/drawable/OvalDrawable.java @@ -20,21 +20,29 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; public class OvalDrawable extends Drawable { private final Paint mPaint; + private final RectF mRectF; public OvalDrawable(int color) { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); mPaint.setColor(color); + mRectF = new RectF(); + } + + @Override + protected void onBoundsChange(Rect bounds) { + mRectF.set(bounds); } @Override public void draw(Canvas canvas) { - canvas.drawOval(new RectF(this.getBounds()), mPaint); + canvas.drawOval(mRectF, mPaint); } @Override diff --git a/src/com/hippo/ehviewer/gallery/GalleryView.java b/src/com/hippo/ehviewer/gallery/GalleryView.java index 01e10d37c..42ac04acf 100644 --- a/src/com/hippo/ehviewer/gallery/GalleryView.java +++ b/src/com/hippo/ehviewer/gallery/GalleryView.java @@ -95,6 +95,9 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, 5 / 7.0f, 1 }; private static final float[] CENTER_AREA_SCALE = { 2 / 7.0f, 3 / 8.0f, 5 / 7.0f, 5 / 8.0f }; + private static final float[] LIGHTNESS_SLIDING_AREA = { + 0, 5 / 6.0f, 1, 1 }; + private static final float MILLSEC_PER_DIX = 0.2f; private static final float CHANGE_PAGE_PROPORTION = 0.1f; @@ -148,6 +151,7 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, private int[] rightArea; private int[] bottomArea; private int[] centerArea; + private int[] mLightnessSlidingArea; private Text leftText; private Text topText; @@ -157,6 +161,8 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, private boolean mDoubleTapAnimating = false; + private boolean mLightnessSliding = false; + private boolean mShowTapArea = false; private boolean mShowTapAreaTurn = false; @@ -172,6 +178,8 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, public void onPageChanged(int index); public void onSizeUpdate(int size); + + public void onSlideBottom(float dx); } public interface OnTapTextListener { @@ -602,6 +610,10 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, (int) (CENTER_AREA_SCALE[1] * mScreenHeight), (int) (CENTER_AREA_SCALE[2] * mScreenWidth), (int) (CENTER_AREA_SCALE[3] * mScreenHeight) }; + mLightnessSlidingArea = new int[] { (int) (LIGHTNESS_SLIDING_AREA[0] * mScreenWidth), + (int) (LIGHTNESS_SLIDING_AREA[1] * mScreenHeight), + (int) (LIGHTNESS_SLIDING_AREA[2] * mScreenWidth), + (int) (LIGHTNESS_SLIDING_AREA[3] * mScreenHeight) }; if (leftText == null) leftText = new Text(mContext.getString(R.string.pre_page), @@ -1188,16 +1200,17 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, } @Override - public boolean onScrollBegin(float dx, float dy, float totalX, - float totalY) { - return onScroll(dx, dy, totalX, totalY); + public boolean onScrollBegin(float dx, float dy, MotionEvent e1, MotionEvent e2) { + mLightnessSliding = Utils.isInArea(mLightnessSlidingArea, + (int) e2.getX(), (int) e2.getY()); + return onScroll(dx, dy, e1, e2); } /** * dx 和 totalX 符号相反,为啥 */ @Override - public boolean onScroll(float dx, float dy, float totalX, float totalY) { + public boolean onScroll(float dx, float dy, MotionEvent e1, MotionEvent e2) { if (isScale) return false; @@ -1210,6 +1223,15 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, if (mDoubleTapAnimating) return false; + if (mLightnessSliding) { + if (mGalleryViewListener != null) + mGalleryViewListener.onSlideBottom(dx); + return true; + } + + float totalX = e2.getX() - e1.getX(); + float totalY = e2.getY() - e1.getY(); + switch (mScrollState) { case SCROLL_ANIME_LEFT: case SCROLL_ANIME_RIGHT: @@ -1300,6 +1322,8 @@ public class GalleryView extends GLView implements ImageSet.ImageListener, return false; if (mDoubleTapAnimating) return false; + if (mLightnessSliding) + return false; switch (mScrollState) { case SCROLL_ANIME_LEFT: diff --git a/src/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java b/src/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java index 68bee58fb..74377d942 100644 --- a/src/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java +++ b/src/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java @@ -33,8 +33,8 @@ public class GestureRecognizer { boolean onDoubleTap(float x, float y); boolean onDoubleTapConfirmed(float x, float y); void onLongPress(MotionEvent e); - boolean onScrollBegin(float dx, float dy, float totalX, float totalY); - boolean onScroll(float dx, float dy, float totalX, float totalY); + boolean onScrollBegin(float dx, float dy, MotionEvent e1, MotionEvent e2); + boolean onScroll(float dx, float dy, MotionEvent e1, MotionEvent e2); boolean onScrollEnd(float totalX, float totalY); boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); boolean onScaleBegin(float focusX, float focusY); @@ -107,18 +107,15 @@ public class GestureRecognizer { } @Override - public boolean onScroll( - MotionEvent e1, MotionEvent e2, float dx, float dy) { + public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) { if (e1.getX() != firstX || e1.getY() != firstY) { mStillScroll = true; firstX = e1.getX(); firstY = e1.getY(); - return mListener.onScrollBegin( - dx, dy, e2.getX() - e1.getX(), e2.getY() - e1.getY()); + return mListener.onScrollBegin(dx, dy, e1, e2); + } else { + return mListener.onScroll(dx, dy, e1, e2); } - else - return mListener.onScroll( - dx, dy, e2.getX() - e1.getX(), e2.getY() - e1.getY()); } @Override diff --git a/src/com/hippo/ehviewer/ui/GalleryActivity.java b/src/com/hippo/ehviewer/ui/GalleryActivity.java index 9f43e614e..e265d8d03 100644 --- a/src/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/src/com/hippo/ehviewer/ui/GalleryActivity.java @@ -19,14 +19,13 @@ package com.hippo.ehviewer.ui; import android.app.ActionBar; import android.app.Activity; import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.Window; import android.view.WindowManager; -import android.view.animation.AlphaAnimation; -import android.view.animation.Animation; -import android.view.animation.Animation.AnimationListener; import android.widget.SeekBar; import android.widget.TextView; @@ -40,9 +39,10 @@ import com.hippo.ehviewer.gallery.GalleryView; import com.hippo.ehviewer.gallery.data.ImageSet; import com.hippo.ehviewer.gallery.ui.GLRootView; import com.hippo.ehviewer.util.Config; -import com.hippo.ehviewer.util.Constants; import com.hippo.ehviewer.util.FullScreenHelper; +import com.hippo.ehviewer.util.MathUtils; import com.hippo.ehviewer.util.Ui; +import com.hippo.ehviewer.widget.ColorView; public class GalleryActivity extends Activity implements GalleryView.GalleryViewListener, SeekBar.OnSeekBarChangeListener, @@ -54,6 +54,9 @@ public class GalleryActivity extends Activity public final static String KEY_GALLERY_INFO = "gallery_info"; public final static String KEY_START_INDEX = "start_index"; + public final static String KEY_LIGHTNESS = "lightness"; + public final static float DEFAULT_LIGHTNESS = 0.5f; + private View mFooter; private TextView mSeekerBubble; @@ -65,11 +68,14 @@ public class GalleryActivity extends Activity private GalleryView mGalleryView; + private ColorView mMaskView; + private GalleryInfo mGi; private FullScreenHelper mFullScreenHelper; - private boolean mFirstTime = true; + private float mLightness; + private int mLightnessScale = 0; private final Runnable mFullScreenTask = new Runnable() { @Override public void run() { @@ -88,33 +94,7 @@ public class GalleryActivity extends Activity void setFullScreen(final boolean fullScreen) { mFullScreenHelper.setFullScreen(fullScreen); - - if (!mFirstTime) { - AlphaAnimation aa = fullScreen ? new AlphaAnimation(1.0f, 0.0f) : - new AlphaAnimation(0.0f, 1.0f); - aa.setDuration(Constants.ANIMATE_TIME); - aa.setAnimationListener(new AnimationListener() { - @Override - public void onAnimationStart(Animation animation) { - if (!fullScreen) - mFooter.setVisibility(View.VISIBLE); - } - - @Override - public void onAnimationEnd(Animation animation) { - if (fullScreen) - mFooter.setVisibility(View.GONE); - } - - @Override - public void onAnimationRepeat(Animation animation) { - // Empty - } - }); - mFooter.startAnimation(aa); - } else { - mFirstTime = false; - } + mFooter.setVisibility(fullScreen ? View.GONE : View.VISIBLE); if (!fullScreen) startFullScreenTask(); @@ -134,12 +114,37 @@ public class GalleryActivity extends Activity setFullScreen(!fullScreen); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + // Need update mLightnessScale + mLightnessScale = 0; + } + @Override protected void onResume() { super.onResume(); setFullScreen(true); } + private void setLightness(float l) { + l = MathUtils.clamp(l, -1.0f, 1.0f); + Window w = getWindow(); + WindowManager.LayoutParams lp = w.getAttributes(); + if (l >= 0.0f) { + lp.screenBrightness = l; + w.setAttributes(lp); + mMaskView.setColor(0); + } else { + if (lp.screenBrightness != 0.0f) { + lp.screenBrightness = 0.0f; + w.setAttributes(lp); + } + mMaskView.setColor(MathUtils.lerp(0x00, 0xde, -l) << 24); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -152,6 +157,7 @@ public class GalleryActivity extends Activity mFooter = findViewById(R.id.footer); mPageSeeker = (SeekBar) findViewById(R.id.page_seeker); mSeekerBubble = (TextView) findViewById(R.id.seeker_bubble); + mMaskView = (ColorView)findViewById(R.id.mask); mActionBar = getActionBar(); Intent intent = getIntent(); @@ -211,6 +217,10 @@ public class GalleryActivity extends Activity .setButtonListener(this) .show(); } + + // lightness + mLightness = Config.getFloat(KEY_LIGHTNESS, DEFAULT_LIGHTNESS); + setLightness(mLightness); } } @@ -270,6 +280,16 @@ public class GalleryActivity extends Activity mPageSeeker.setProgress(mGalleryView.getCurIndex() + 1); } + @Override + public void onSlideBottom(float dx) { + if (mLightnessScale == 0) + mLightnessScale = mMaskView.getWidth(); + + mLightness = MathUtils.clamp(mLightness - (dx / mLightnessScale), -1.0f, 1.0f); + setLightness(mLightness); + Config.setFloat(KEY_LIGHTNESS, mLightness); + } + private void showSeekBubble() { mSeekerBubble.setVisibility(View.VISIBLE); } diff --git a/src/com/hippo/ehviewer/util/Config.java b/src/com/hippo/ehviewer/util/Config.java index 0ff46237a..44b252172 100644 --- a/src/com/hippo/ehviewer/util/Config.java +++ b/src/com/hippo/ehviewer/util/Config.java @@ -105,6 +105,14 @@ public final class Config { mConfigPre.edit().putString(key, Integer.toString(value)).apply(); } + public static float getFloat(String key, float defValue) { + return mConfigPre.getFloat(key, defValue); + } + + public static void setFloat(String key, float value) { + mConfigPre.edit().putFloat(key, value).apply(); + } + /****** Display ******/ diff --git a/src/com/hippo/ehviewer/widget/ColorView.java b/src/com/hippo/ehviewer/widget/ColorView.java new file mode 100644 index 000000000..5bfc07c13 --- /dev/null +++ b/src/com/hippo/ehviewer/widget/ColorView.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2014 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.ehviewer.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Canvas; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; + +public class ColorView extends View { + + private int mColor; + + public ColorView(Context context) { + super(context); + } + + public ColorView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ColorView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public ColorView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public void setColor(int color) { + if (mColor != color) { + mColor = color; + invalidate(); + } + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawColor(mColor); + } +}