Update scene dialog

This commit is contained in:
seven332 committed 2015-04-27 16:46:25 +08:00
1 parent 5cc9acc365
commit 09cda0ce06
14 files changed
+505 -43

No files matched your search

@@ -28,8 +28,6 @@ import com.hippo.widget.HotspotTouchHelper;
public final class RippleSalon {
private static final Drawable MASK = new ColorDrawable(Color.BLACK);
public static void addRipple(View c, boolean dark) {
Resources resources = c.getContext().getResources();
ColorStateList color = ColorStateList.valueOf(
@@ -41,17 +39,16 @@ public final class RippleSalon {
addRipple(v, color, v.getBackground());
}
@SuppressWarnings("deprecation")
public static void addRipple(View v, ColorStateList color, Drawable content) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
RippleDrawable rippleDrawable = new RippleDrawable(color, content);
v.setOnTouchListener(new HotspotTouchHelper(rippleDrawable));
//noinspection deprecation
v.setBackgroundDrawable(rippleDrawable);
} else {
android.graphics.drawable.RippleDrawable rippleDrawable =
new android.graphics.drawable.RippleDrawable(color, content, MASK);
//noinspection deprecation
v.setBackgroundDrawable(rippleDrawable);
new android.graphics.drawable.RippleDrawable(color, content, new ColorDrawable(Color.BLACK));
v.setBackground(rippleDrawable);
}
}
}
@@ -28,8 +28,6 @@ import com.hippo.ehviewer.widget.SearchBar;
import com.hippo.ehviewer.widget.SearchDatabase;
import com.hippo.ehviewer.widget.SearchLayout;
import com.hippo.scene.Scene;
import com.hippo.scene.SimpleDialog;
import com.hippo.util.AppHandler;
import com.hippo.util.Log;
import com.hippo.util.ViewUtils;
@@ -79,13 +77,6 @@ class GalleryListScene extends Scene implements SearchBar.Helper {
// TEST
mContentLayout.showText("四姑拉斯基");
AppHandler.getInstance().postDelayed(new Runnable() {
@Override
public void run() {
new SimpleDialog.Builder().setTitle("NIhao").show();
}
}, 2000);
}
@Override
+4 -7
View File
@@ -26,7 +26,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.widget.AbsoluteLayout;
import android.widget.FrameLayout;
import com.hippo.util.AssertUtils;
@@ -52,7 +51,7 @@ public abstract class Scene {
private @Nullable Announcer mAnnouncer;
@SuppressWarnings("deprecation")
private @Nullable AbsoluteLayout mSceneView;
private @Nullable SceneView mSceneView;
private int mBackgroundColor = 0xffeeeeee; // TODO Need a better to set background color
@@ -94,7 +93,7 @@ public abstract class Scene {
*
* @return Null or nonull
*/
public @Nullable ViewGroup getSceneView() {
public @Nullable SceneView getSceneView() {
return mSceneView;
}
@@ -119,9 +118,8 @@ public abstract class Scene {
mState = state;
}
@SuppressWarnings("deprecation")
protected AbsoluteLayout createSceneView(Context context) {
return new AbsoluteLayout(context);
protected SceneView createSceneView(Context context) {
return new SceneView(context);
}
public final void finish() {
@@ -221,7 +219,6 @@ public abstract class Scene {
private void initBackground(@NonNull View bg) {
bg.setBackgroundColor(mBackgroundColor);
bg.setClickable(true);
bg.setFocusable(true);
bg.setFocusableInTouchMode(true);
bg.requestFocus();
@@ -0,0 +1,47 @@
/*
* Copyright (C) 2015 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
* 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.scene;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.AbsoluteLayout;
@SuppressWarnings("deprecation")
public class SceneView extends AbsoluteLayout {
public SceneView(Context context) {
super(context);
init();
}
public SceneView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SceneView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setClickable(true);
}
@Override
protected void dispatchSetPressed(boolean pressed) {
// Don't dispatch it to children
}
}
@@ -15,14 +15,22 @@
package com.hippo.scene;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.view.View;
import android.widget.Space;
import android.widget.TextView;
import com.hippo.effect.ripple.RippleSalon;
import com.hippo.ehviewer.R;
import com.hippo.util.ViewUtils;
import com.hippo.widget.IndicatingScrollView;
public class SimpleDialog extends SceneDialog {
public class SimpleDialog extends SceneDialog implements View.OnClickListener,
SimpleDialogView.OnClickOutOfDialogListener {
private static final int BACKGROUND_COLOR = 0x61000000;
@@ -30,10 +38,20 @@ public class SimpleDialog extends SceneDialog {
private StageActivity mActivity;
private SimpleDialogView mSimpleImageView;
private SimpleDialogFrame mFrame;
private View mBody;
private TextView mTitle;
private Space mSpaceTitleContent;
private IndicatingScrollView mContent;
private TextView mMessage;
private View mButtonsSingleLine;
private TextView mNegativeButton;
private View mSpacePositiveNegative;
private TextView mPositiveButton;
private SimpleDialog(Builder builder) {
private SimpleDialog(@NonNull Builder builder) {
mBuilder = builder;
}
@@ -51,13 +69,65 @@ public class SimpleDialog extends SceneDialog {
mActivity.getLayoutInflater().inflate(R.layout.simple_dialog, mFrame);
mTitle = (TextView) findViewById(R.id.title);
mSimpleImageView = (SimpleDialogView) getSceneView();
mBody = findViewById(R.id.body);
mTitle = (TextView) mBody.findViewById(R.id.title);
mSpaceTitleContent = (Space) mBody.findViewById(R.id.space_title_content);
mContent = (IndicatingScrollView) findViewById(R.id.content);
mMessage = (TextView) mBody.findViewById(R.id.message);
mButtonsSingleLine = findViewById(R.id.buttons_single_line);
mNegativeButton = (TextView) mButtonsSingleLine.findViewById(R.id.negative);
mSpacePositiveNegative = mButtonsSingleLine.findViewById(R.id.space_positive_negative);
mPositiveButton = (TextView) mButtonsSingleLine.findViewById(R.id.positive);
bindDialog();
}
private void bindDialog() {
mTitle.setText(mBuilder.mTitle);
if (mBuilder.mTitle == null && mBuilder.mMessage == null) {
ViewUtils.setVisibility(mBody, View.GONE);
} else {
if (mBuilder.mTitle != null) {
mTitle.setText(mBuilder.mTitle);
} else {
ViewUtils.setVisibility(mTitle, View.GONE);
ViewUtils.setVisibility(mSpaceTitleContent, View.GONE);
}
if (mBuilder.mMessage != null) {
mMessage.setText(mBuilder.mMessage);
} else {
ViewUtils.setVisibility(mContent, View.GONE);
ViewUtils.setVisibility(mSpaceTitleContent, View.GONE);
}
}
if (mBuilder.mPositiveButtonText == null && mBuilder.mNegativeButtonText == null) {
ViewUtils.setVisibility(mButtonsSingleLine, View.GONE);
} else {
if (mBuilder.mPositiveButtonText != null) {
mPositiveButton.setText(mBuilder.mPositiveButtonText);
mPositiveButton.setOnClickListener(this);
RippleSalon.addRipple(mPositiveButton, false);
} else {
ViewUtils.setVisibility(mPositiveButton, View.GONE);
ViewUtils.setVisibility(mSpacePositiveNegative, View.GONE);
}
if (mBuilder.mNegativeButtonText != null) {
mNegativeButton.setText(mBuilder.mNegativeButtonText);
mNegativeButton.setOnClickListener(this);
RippleSalon.addRipple(mNegativeButton, false);
} else {
ViewUtils.setVisibility(mNegativeButton, View.GONE);
ViewUtils.setVisibility(mSpacePositiveNegative, View.GONE);
}
}
mSimpleImageView.setOnClickOutOfDialogListener(this);
}
@Override
protected SceneView createSceneView(Context context) {
return new SimpleDialogView(context);
}
@Override
@@ -65,15 +135,78 @@ public class SimpleDialog extends SceneDialog {
mFrame.setFitPaddingBottom(b);
}
@Override
public void onClick(View v) {
if (v == mPositiveButton) {
finish();
} else if (v == mNegativeButton) {
finish();
}
}
@Override
public void onClickOutOfDialog() {
if (mBuilder.mCancelable) {
finish();
}
}
public static class Builder {
private Context mContext;
private String mTitle;
private String mMessage;
private String mPositiveButtonText;
private String mNegativeButtonText;
private boolean mCancelable = true;
public Builder(Context context) {
mContext = context;
}
public Builder setTitle(String title) {
mTitle = title;
return this;
}
public Builder setTitle(@StringRes int resId) {
return setTitle(mContext.getString(resId));
}
public Builder setMessage(String message) {
mMessage = message;
return this;
}
public Builder setMessage(@StringRes int resId) {
return setMessage(mContext.getString(resId));
}
public Builder setPositiveButton(String string) {
mPositiveButtonText = string;
return this;
}
public Builder setPositiveButton(int resId) {
return setPositiveButton(mContext.getString(resId));
}
public Builder setNegativeButton(String string) {
mNegativeButtonText = string;
return this;
}
public Builder setNegativeButton(int resId) {
return setNegativeButton(mContext.getString(resId));
}
public Builder setCancelable(boolean cancelable) {
mCancelable = cancelable;
return this;
}
public @NonNull SceneDialog build() {
return new SimpleDialog(this);
}
@@ -0,0 +1,84 @@
/*
* Copyright (C) 2015 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
* 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.scene;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import com.hippo.util.ViewUtils;
import com.hippo.widget.HotspotTouchHelper;
import com.hippo.widget.Hotspotable;
public class SimpleDialogView extends SceneView implements View.OnClickListener, Hotspotable {
private float mHostpotX;
private float mHostpotY;
private OnClickOutOfDialogListener mOnClickOutOfDialogListener;
public SimpleDialogView(Context context) {
super(context);
init();
}
public SimpleDialogView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SimpleDialogView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setSoundEffectsEnabled(false);
setOnClickListener(this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
setOnTouchListener(new HotspotTouchHelper(this));
}
}
public void setOnClickOutOfDialogListener(OnClickOutOfDialogListener listener) {
mOnClickOutOfDialogListener = listener;
}
@Override
public void setHotspot(float x, float y) {
mHostpotX = x;
mHostpotY = y;
}
@Override
public void drawableHotspotChanged(float x, float y) {
mHostpotX = x;
mHostpotY = y;
}
@Override
public void onClick(View v) {
if (v == this && !ViewUtils.isViewUnder(getChildAt(0), (int) mHostpotX, (int) mHostpotY) &&
mOnClickOutOfDialogListener != null) {
mOnClickOutOfDialogListener.onClickOutOfDialog();
}
}
public interface OnClickOutOfDialogListener {
void onClickOutOfDialog();
}
}
@@ -244,7 +244,7 @@ public final class ViewUtils {
* @param y Y position to test in the parent's coordinate system
* @return true if the supplied view is under the given point, false otherwise
*/
public static boolean isViewUnder(View view, int x, int y) {
public static boolean isViewUnder(@Nullable View view, int x, int y) {
if (view == null || view.getVisibility() != View.VISIBLE) {
return false;
}
@@ -0,0 +1,92 @@
/*
* Copyright (C) 2015 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
* 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.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.widget.ScrollView;
import com.hippo.ehviewer.R;
public class IndicatingScrollView extends ScrollView {
private int mIndicatorHeight;
private Paint mPaint = new Paint();
private Rect mTemp = new Rect();
public IndicatingScrollView(Context context) {
super(context);
init(context);
}
public IndicatingScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public IndicatingScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mIndicatorHeight = context.getResources().getDimensionPixelOffset(R.dimen.scroll_view_indicator_height);
mPaint.setColor(context.getResources().getColor(R.color.scroll_view_indicator));
mPaint.setStyle(Paint.Style.FILL);
}
private void fillTopIndicatorDrawRect() {
mTemp.set(0, 0, getWidth(), mIndicatorHeight);
}
private void fillBottomIndicatorDrawRect() {
mTemp.set(0, getHeight() - mIndicatorHeight, getWidth(), getHeight());
}
private boolean needShowTopIndicator() {
return canScrollVertically(-1);
}
private boolean needShowBottomIndicator() {
return canScrollVertically(1);
}
@Override
public void draw(@NonNull Canvas canvas) {
super.draw(canvas);
final int restoreCount = canvas.save();
canvas.translate(getScrollX(), getScrollY());
// Draw top indicator
if (needShowTopIndicator()) {
fillTopIndicatorDrawRect();
canvas.drawRect(mTemp, mPaint);
}
// Draw bottom indicator
if (needShowBottomIndicator()) {
fillBottomIndicatorDrawRect();
canvas.drawRect(mTemp, mPaint);
}
canvas.restoreToCount(restoreCount);
}
}
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2015 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
* 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.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
public class NotifyingScrollView extends ScrollView {
private OnScrollChangeListener mOnScrollChangeListener;
public NotifyingScrollView(Context context) {
super(context);
}
public NotifyingScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NotifyingScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setOnScrollChangeListener(OnScrollChangeListener listener) {
mOnScrollChangeListener = listener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangeListener != null) {
mOnScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
}
}
}
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2015 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
* 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.widget;
import android.view.View;
/**
* Interface definition for a callback to be invoked when the scroll
* position of a view changes.
*/
public interface OnScrollChangeListener {
/**
* Called when the scroll position of a view changes.
*
* @param v The view whose scroll position has changed.
* @param scrollX Current horizontal scroll origin.
* @param scrollY Current vertical scroll origin.
* @param oldScrollX Previous horizontal scroll origin.
* @param oldScrollY Previous vertical scroll origin.
*/
void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);
}