DirectionDragImageButton
This commit is contained in:
parent
56d1d2b249
commit
675626bc77
@ -12,33 +12,18 @@ import android.util.TypedValue;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
import org.solovyev.android.calculator.ActivityLauncher;
|
|
||||||
import org.solovyev.android.calculator.App;
|
|
||||||
import org.solovyev.android.calculator.BaseActivity;
|
|
||||||
import org.solovyev.android.calculator.Calculator;
|
|
||||||
import org.solovyev.android.calculator.Editor;
|
|
||||||
import org.solovyev.android.calculator.Keyboard;
|
|
||||||
import org.solovyev.android.calculator.Preferences;
|
|
||||||
import org.solovyev.android.calculator.PreferredPreferences;
|
|
||||||
import org.solovyev.android.calculator.buttons.CppSpecialButton;
|
import org.solovyev.android.calculator.buttons.CppSpecialButton;
|
||||||
import org.solovyev.android.views.Adjuster;
|
import org.solovyev.android.views.Adjuster;
|
||||||
import org.solovyev.android.views.dragbutton.DirectionDragButton;
|
import org.solovyev.android.views.dragbutton.*;
|
||||||
import org.solovyev.android.views.dragbutton.DirectionDragListener;
|
|
||||||
import org.solovyev.android.views.dragbutton.DragButton;
|
|
||||||
import org.solovyev.android.views.dragbutton.DragDirection;
|
|
||||||
import org.solovyev.android.views.dragbutton.DragEvent;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||||
import static android.view.HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING;
|
import static android.view.HapticFeedbackConstants.*;
|
||||||
import static android.view.HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING;
|
|
||||||
import static android.view.HapticFeedbackConstants.KEYBOARD_TAP;
|
|
||||||
import static org.solovyev.android.calculator.App.cast;
|
import static org.solovyev.android.calculator.App.cast;
|
||||||
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple;
|
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple;
|
||||||
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple_mobile;
|
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple_mobile;
|
||||||
@ -53,7 +38,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
|
|||||||
public static final float IMAGE_SCALE_ERASE = 0.4f;
|
public static final float IMAGE_SCALE_ERASE = 0.4f;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final List<DragButton> dragButtons = new ArrayList<>();
|
private final List<DragView> dragButtons = new ArrayList<>();
|
||||||
@NonNull
|
@NonNull
|
||||||
protected final DirectionDragListener listener;
|
protected final DirectionDragListener listener;
|
||||||
@Inject
|
@Inject
|
||||||
@ -125,6 +110,17 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
|
|||||||
button.setOnClickListener(this);
|
button.setOnClickListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final void prepareButton(@Nullable DirectionDragImageButton button) {
|
||||||
|
if (button == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dragButtons.add(button);
|
||||||
|
button.setVibrateOnDrag(keyboard.isVibrateOnKeypress());
|
||||||
|
prepareButton((ImageView) button);
|
||||||
|
button.setOnDragListener(listener);
|
||||||
|
button.setTypeface(typeface);
|
||||||
|
}
|
||||||
|
|
||||||
protected final void prepareButton(@Nullable DirectionDragButton button) {
|
protected final void prepareButton(@Nullable DirectionDragButton button) {
|
||||||
if (button == null) {
|
if (button == null) {
|
||||||
return;
|
return;
|
||||||
@ -173,7 +169,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
|
|||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
if (Preferences.Gui.vibrateOnKeypress.isSameKey(key)) {
|
if (Preferences.Gui.vibrateOnKeypress.isSameKey(key)) {
|
||||||
final boolean vibrate = Preferences.Gui.vibrateOnKeypress.getPreference(preferences);
|
final boolean vibrate = Preferences.Gui.vibrateOnKeypress.getPreference(preferences);
|
||||||
for (DragButton dragButton : dragButtons) {
|
for (DragView dragButton : dragButtons) {
|
||||||
dragButton.setVibrateOnDrag(vibrate);
|
dragButton.setVibrateOnDrag(vibrate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,10 @@ import android.util.Log;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import jscl.AngleUnit;
|
||||||
|
import jscl.NumeralBase;
|
||||||
import org.solovyev.android.calculator.ActivityLauncher;
|
import org.solovyev.android.calculator.ActivityLauncher;
|
||||||
import org.solovyev.android.calculator.Engine;
|
import org.solovyev.android.calculator.Engine;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
@ -18,23 +21,15 @@ import org.solovyev.android.calculator.buttons.CppSpecialButton;
|
|||||||
import org.solovyev.android.calculator.history.History;
|
import org.solovyev.android.calculator.history.History;
|
||||||
import org.solovyev.android.calculator.view.AngleUnitsButton;
|
import org.solovyev.android.calculator.view.AngleUnitsButton;
|
||||||
import org.solovyev.android.views.dragbutton.DirectionDragButton;
|
import org.solovyev.android.views.dragbutton.DirectionDragButton;
|
||||||
|
import org.solovyev.android.views.dragbutton.DirectionDragImageButton;
|
||||||
import org.solovyev.android.views.dragbutton.DragButton;
|
import org.solovyev.android.views.dragbutton.DragButton;
|
||||||
import org.solovyev.android.views.dragbutton.DragDirection;
|
import org.solovyev.android.views.dragbutton.DragDirection;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import butterknife.Bind;
|
import static org.solovyev.android.calculator.Engine.Preferences.*;
|
||||||
import butterknife.ButterKnife;
|
import static org.solovyev.android.views.dragbutton.DragDirection.*;
|
||||||
import jscl.AngleUnit;
|
|
||||||
import jscl.NumeralBase;
|
|
||||||
|
|
||||||
import static org.solovyev.android.calculator.Engine.Preferences.angleUnit;
|
|
||||||
import static org.solovyev.android.calculator.Engine.Preferences.multiplicationSign;
|
|
||||||
import static org.solovyev.android.calculator.Engine.Preferences.numeralBase;
|
|
||||||
import static org.solovyev.android.views.dragbutton.DragDirection.down;
|
|
||||||
import static org.solovyev.android.views.dragbutton.DragDirection.left;
|
|
||||||
import static org.solovyev.android.views.dragbutton.DragDirection.up;
|
|
||||||
|
|
||||||
public class KeyboardUi extends BaseKeyboardUi {
|
public class KeyboardUi extends BaseKeyboardUi {
|
||||||
|
|
||||||
@ -74,7 +69,7 @@ public class KeyboardUi extends BaseKeyboardUi {
|
|||||||
@Bind(R.id.cpp_button_functions)
|
@Bind(R.id.cpp_button_functions)
|
||||||
DirectionDragButton functionsButton;
|
DirectionDragButton functionsButton;
|
||||||
@Bind(R.id.cpp_button_history)
|
@Bind(R.id.cpp_button_history)
|
||||||
DirectionDragButton historyButton;
|
DirectionDragImageButton historyButton;
|
||||||
@Bind(R.id.cpp_button_multiplication)
|
@Bind(R.id.cpp_button_multiplication)
|
||||||
DirectionDragButton multiplicationButton;
|
DirectionDragButton multiplicationButton;
|
||||||
@Bind(R.id.cpp_button_plus)
|
@Bind(R.id.cpp_button_plus)
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package org.solovyev.android.views.dragbutton;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.text.TextPaint;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
public class DirectionDragImageButton extends DragImageButton {
|
||||||
|
private final DirectionTextView textView = new DirectionTextView();
|
||||||
|
private final TextPaint baseTextPaint = new TextPaint();
|
||||||
|
|
||||||
|
public DirectionDragImageButton(Context context) {
|
||||||
|
super(context);
|
||||||
|
init(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectionDragImageButton(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
init(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectionDragImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
|
super(context, attrs, defStyleAttr);
|
||||||
|
init(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectionDragImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||||
|
super(context, attrs, defStyleAttr, defStyleRes);
|
||||||
|
init(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init(@Nullable AttributeSet attrs) {
|
||||||
|
final TextView view = new TextView(getContext(), attrs);
|
||||||
|
baseTextPaint.set(view.getPaint());
|
||||||
|
textView.init(this, attrs, baseTextPaint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
textView.draw(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected DirectionTextView.Text getText(@NonNull DragDirection direction) {
|
||||||
|
return textView.getText(direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTypeface(@Nonnull Typeface newTypeface) {
|
||||||
|
final Typeface oldTypeface = baseTextPaint.getTypeface();
|
||||||
|
if(oldTypeface == newTypeface) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
baseTextPaint.setTypeface(newTypeface);
|
||||||
|
textView.setBaseTextPaint(baseTextPaint);
|
||||||
|
}
|
||||||
|
}
|
@ -12,9 +12,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
|
||||||
import org.solovyev.android.Check;
|
import org.solovyev.android.Check;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
|
|
||||||
@ -178,25 +176,32 @@ public class DirectionTextView {
|
|||||||
|
|
||||||
private void calculatePosition() {
|
private void calculatePosition() {
|
||||||
paint.getTextBounds(value, 0, value.length(), bounds);
|
paint.getTextBounds(value, 0, value.length(), bounds);
|
||||||
|
|
||||||
|
final int paddingLeft = padding;
|
||||||
|
final int paddingRight = padding;
|
||||||
|
final int paddingTop = padding;
|
||||||
|
final int paddingBottom = padding;
|
||||||
|
final int verticalPaddings = 0;
|
||||||
|
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case up:
|
case up:
|
||||||
case down:
|
case down:
|
||||||
position.x = view.getWidth() - view.getPaddingLeft() - padding - bounds.width();
|
position.x = view.getWidth() - paddingLeft - bounds.width();
|
||||||
if (direction == DragDirection.up) {
|
if (direction == DragDirection.up) {
|
||||||
position.y = view.getPaddingTop() + padding + bounds.height();
|
position.y = paddingTop + bounds.height();
|
||||||
} else {
|
} else {
|
||||||
position.y = view.getHeight() - view.getPaddingBottom() - padding;
|
position.y = view.getHeight() - paddingBottom;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case left:
|
case left:
|
||||||
case right:
|
case right:
|
||||||
if (direction == DragDirection.left) {
|
if (direction == DragDirection.left) {
|
||||||
position.x = view.getPaddingLeft() + padding;
|
position.x = paddingLeft;
|
||||||
} else {
|
} else {
|
||||||
position.x = view.getWidth() - view.getPaddingLeft() - padding - bounds.width();
|
position.x = view.getWidth() - paddingRight - bounds.width();
|
||||||
}
|
}
|
||||||
final int availableHeight = view.getHeight() - view.getPaddingTop() - view.getPaddingBottom();
|
final int availableHeight = view.getHeight() - verticalPaddings;
|
||||||
position.y = view.getPaddingTop() + padding + availableHeight / 2 + bounds.height() / 2;
|
position.y = paddingTop + availableHeight / 2 + bounds.height() / 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import android.util.AttributeSet;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
public class DragButton extends Button {
|
public class DragButton extends Button implements DragView {
|
||||||
@NonNull
|
@NonNull
|
||||||
private final DragGestureDetector dragDetector = new DragGestureDetector(this);
|
private final DragGestureDetector dragDetector = new DragGestureDetector(this);
|
||||||
|
|
||||||
@ -41,10 +41,12 @@ public class DragButton extends Button {
|
|||||||
return super.onTouchEvent(event);
|
return super.onTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setOnDragListener(@Nullable DragListener listener) {
|
public void setOnDragListener(@Nullable DragListener listener) {
|
||||||
dragDetector.setListener(listener);
|
dragDetector.setListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setVibrateOnDrag(boolean vibrateOnDrag) {
|
public void setVibrateOnDrag(boolean vibrateOnDrag) {
|
||||||
dragDetector.setVibrateOnDrag(vibrateOnDrag);
|
dragDetector.setVibrateOnDrag(vibrateOnDrag);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
package org.solovyev.android.views.dragbutton;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
|
||||||
|
public class DragImageButton extends ImageButton implements DragView {
|
||||||
|
@NonNull
|
||||||
|
private final DragGestureDetector dragDetector = new DragGestureDetector(this);
|
||||||
|
|
||||||
|
public DragImageButton(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DragImageButton(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DragImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
|
super(context, attrs, defStyleAttr);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
public DragImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||||
|
super(context, attrs, defStyleAttr, defStyleRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
|
if (dragDetector.onTouchEvent(event)) {
|
||||||
|
final MotionEvent cancelEvent = DragGestureDetector.makeCancelEvent(event);
|
||||||
|
super.onTouchEvent(cancelEvent);
|
||||||
|
cancelEvent.recycle();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onTouchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnDragListener(@Nullable DragListener listener) {
|
||||||
|
dragDetector.setListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVibrateOnDrag(boolean vibrateOnDrag) {
|
||||||
|
dragDetector.setVibrateOnDrag(vibrateOnDrag);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package org.solovyev.android.views.dragbutton;
|
||||||
|
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
public interface DragView {
|
||||||
|
void setOnDragListener(@Nullable DragListener listener);
|
||||||
|
|
||||||
|
void setVibrateOnDrag(boolean vibrateOnDrag);
|
||||||
|
}
|
BIN
app/src/main/res/drawable-hdpi/ic_history_white_48dp.png
Normal file
BIN
app/src/main/res/drawable-hdpi/ic_history_white_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 870 B |
BIN
app/src/main/res/drawable-mdpi/ic_history_white_48dp.png
Normal file
BIN
app/src/main/res/drawable-mdpi/ic_history_white_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 604 B |
BIN
app/src/main/res/drawable-xhdpi/ic_history_white_48dp.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/ic_history_white_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_history_white_48dp.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/ic_history_white_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_history_white_48dp.png
Normal file
BIN
app/src/main/res/drawable-xxxhdpi/ic_history_white_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
@ -21,12 +21,11 @@
|
|||||||
~ Email: se.solovyev@gmail.com
|
~ Email: se.solovyev@gmail.com
|
||||||
~ Site: http://se.solovyev.org
|
~ Site: http://se.solovyev.org
|
||||||
-->
|
-->
|
||||||
<org.solovyev.android.views.dragbutton.DirectionDragButton
|
<org.solovyev.android.views.dragbutton.DirectionDragImageButton
|
||||||
xmlns:a="http://schemas.android.com/apk/res/android"
|
xmlns:a="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:c="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
a:id="@id/cpp_button_history"
|
a:id="@id/cpp_button_history"
|
||||||
style="?attr/cpp_button_style_control"
|
style="?attr/cpp_button_style_control"
|
||||||
a:text="@string/c_history_button"
|
a:src="@drawable/ic_history_white_48dp"
|
||||||
a:textStyle="bold"
|
app:directionTextDown="@string/cpp_kb_redo"
|
||||||
c:directionTextDown="@string/cpp_kb_redo"
|
app:directionTextUp="@string/cpp_kb_undo" />
|
||||||
c:directionTextUp="@string/cpp_kb_undo" />
|
|
Loading…
Reference in New Issue
Block a user