Merge pull request #39 from BrianPinsard/master

Implement changing brush size (saves in preferences)
This commit is contained in:
Tibor Kaputa 2017-01-18 17:54:41 +01:00 committed by GitHub
commit f77edd5e64
17 changed files with 181 additions and 17 deletions

View File

@ -31,6 +31,14 @@ public class Config {
mPrefs.edit().putBoolean(Constants.IS_DARK_THEME, isDarkTheme).apply(); mPrefs.edit().putBoolean(Constants.IS_DARK_THEME, isDarkTheme).apply();
} }
public boolean getIsStrokeWidthBarEnabled() {
return mPrefs.getBoolean(Constants.IS_STROKE_WIDTH_BAR_ENABLED, false);
}
public void setIsStrokeWidthBarEnabled(boolean isStrokeWidthBarEnabled) {
mPrefs.edit().putBoolean(Constants.IS_STROKE_WIDTH_BAR_ENABLED, isStrokeWidthBarEnabled).apply();
}
public int getBrushColor() { public int getBrushColor() {
return mPrefs.getInt(Constants.BRUSH_COLOR_KEY, Color.BLACK); return mPrefs.getInt(Constants.BRUSH_COLOR_KEY, Color.BLACK);
} }
@ -39,6 +47,14 @@ public class Config {
mPrefs.edit().putInt(Constants.BRUSH_COLOR_KEY, color).apply(); mPrefs.edit().putInt(Constants.BRUSH_COLOR_KEY, color).apply();
} }
public float getStrokeWidth() {
return mPrefs.getFloat(Constants.STROKE_WIDTH_KEY, 5.0f);
}
public void setStrokeWidth(float strokeWidth) {
mPrefs.edit().putFloat(Constants.STROKE_WIDTH_KEY, strokeWidth).apply();
}
public int getBackgroundColor() { public int getBackgroundColor() {
return mPrefs.getInt(Constants.BACKGROUND_COLOR_KEY, Color.WHITE); return mPrefs.getInt(Constants.BACKGROUND_COLOR_KEY, Color.WHITE);
} }

View File

@ -4,7 +4,9 @@ public class Constants {
// shared preferences // shared preferences
public static final String PREFS_KEY = "Draw"; public static final String PREFS_KEY = "Draw";
public static final String BRUSH_COLOR_KEY = "brush_color"; public static final String BRUSH_COLOR_KEY = "brush_color";
public static final String STROKE_WIDTH_KEY = "stroke_width";
public static final String BACKGROUND_COLOR_KEY = "background_color"; public static final String BACKGROUND_COLOR_KEY = "background_color";
public static final String IS_FIRST_RUN = "is_first_run"; public static final String IS_FIRST_RUN = "is_first_run";
public static final String IS_DARK_THEME = "is_dark_theme"; public static final String IS_DARK_THEME = "is_dark_theme";
public static final String IS_STROKE_WIDTH_BAR_ENABLED = "is_stroke_width_bar_enabled";
} }

View File

@ -1,6 +1,7 @@
package com.simplemobiletools.draw; package com.simplemobiletools.draw;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
@ -17,29 +18,32 @@ import java.util.Map;
public class MyCanvas extends View { public class MyCanvas extends View {
private Paint mPaint; private Paint mPaint;
private MyPath mPath; private MyPath mPath;
private Map<MyPath, Integer> mPaths; private Map<MyPath, PaintOptions> mPaths;
private PathsChangedListener mListener; private PathsChangedListener mListener;
private int mColor; private PaintOptions mPaintOptions;
private float mCurX; private float mCurX;
private float mCurY; private float mCurY;
private float mStartX; private float mStartX;
private float mStartY; private float mStartY;
private boolean mIsSaving = false;
private boolean mIsStrokeWidthBarEnabled = false;
public MyCanvas(Context context, AttributeSet attrs) { public MyCanvas(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mPath = new MyPath(); mPath = new MyPath();
mPaint = new Paint(); mPaint = new Paint();
mPaint.setColor(Color.BLACK); mPaintOptions = new PaintOptions();
mPaint.setColor(mPaintOptions.color);
mPaint.setStyle(Paint.Style.STROKE); mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(5f); mPaint.setStrokeWidth(mPaintOptions.strokeWidth);
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mPaths = new LinkedHashMap<>(); mPaths = new LinkedHashMap<>();
mPaths.put(mPath, mPaint.getColor()); mPaths.put(mPath, mPaintOptions);
pathsUpdated(); pathsUpdated();
} }
@ -62,14 +66,31 @@ public class MyCanvas extends View {
} }
public void setColor(int newColor) { public void setColor(int newColor) {
mColor = newColor; mPaintOptions.color = newColor;
if (mIsStrokeWidthBarEnabled) {
invalidate();
}
}
public void setStrokeWidth(float newStrokeWidth) {
mPaintOptions.strokeWidth = newStrokeWidth;
if (mIsStrokeWidthBarEnabled) {
invalidate();
}
}
public void setIsStrokeWidthBarEnabled(boolean isStrokeWidthBarEnabled) {
mIsStrokeWidthBarEnabled = isStrokeWidthBarEnabled;
invalidate();
} }
public Bitmap getBitmap() { public Bitmap getBitmap() {
final Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); final Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap); final Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE); canvas.drawColor(Color.WHITE);
mIsSaving = true;
draw(canvas); draw(canvas);
mIsSaving = false;
return bitmap; return bitmap;
} }
@ -77,13 +98,31 @@ public class MyCanvas extends View {
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
super.onDraw(canvas); super.onDraw(canvas);
for (Map.Entry<MyPath, Integer> entry : mPaths.entrySet()) { for (Map.Entry<MyPath, PaintOptions> entry : mPaths.entrySet()) {
mPaint.setColor(entry.getValue()); changePaint(entry.getValue());
canvas.drawPath(entry.getKey(), mPaint); canvas.drawPath(entry.getKey(), mPaint);
} }
mPaint.setColor(mColor); changePaint(mPaintOptions);
canvas.drawPath(mPath, mPaint); canvas.drawPath(mPath, mPaint);
if (mIsStrokeWidthBarEnabled && !mIsSaving) {
drawPreviewDot(canvas);
}
}
private void drawPreviewDot(Canvas canvas) {
Resources res = getResources();
mPaint.setColor(Utils.shouldUseWhite(mPaintOptions.color) ? Color.WHITE : Color.BLACK);
mPaint.setStrokeWidth(mPaintOptions.strokeWidth + res.getDimension(R.dimen.preview_dot_stroke_size));
canvas.drawPoint(getWidth() / 2, getHeight() - res.getDimension(R.dimen.preview_dot_offset_y), mPaint);
changePaint(mPaintOptions);
canvas.drawPoint(getWidth() / 2, getHeight() - res.getDimension(R.dimen.preview_dot_offset_y), mPaint);
}
private void changePaint(PaintOptions paintOptions) {
mPaint.setColor(paintOptions.color);
mPaint.setStrokeWidth(paintOptions.strokeWidth);
} }
public void clearCanvas() { public void clearCanvas() {
@ -116,9 +155,10 @@ public class MyCanvas extends View {
mPath.lineTo(mCurX + 1, mCurY); mPath.lineTo(mCurX + 1, mCurY);
} }
mPaths.put(mPath, mPaint.getColor()); mPaths.put(mPath, mPaintOptions);
pathsUpdated(); pathsUpdated();
mPath = new MyPath(); mPath = new MyPath();
mPaintOptions = new PaintOptions(mPaintOptions.color, mPaintOptions.strokeWidth);
} }
private void pathsUpdated() { private void pathsUpdated() {
@ -179,7 +219,7 @@ public class MyCanvas extends View {
} }
static class SavedState extends BaseSavedState { static class SavedState extends BaseSavedState {
Map<MyPath, Integer> mPaths; Map<MyPath, PaintOptions> mPaths;
SavedState(Parcelable superState) { SavedState(Parcelable superState) {
super(superState); super(superState);
@ -189,9 +229,11 @@ public class MyCanvas extends View {
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags); super.writeToParcel(out, flags);
out.writeInt(mPaths.size()); out.writeInt(mPaths.size());
for (Map.Entry<MyPath, Integer> entry : mPaths.entrySet()) { for (Map.Entry<MyPath, PaintOptions> entry : mPaths.entrySet()) {
out.writeSerializable(entry.getKey()); out.writeSerializable(entry.getKey());
out.writeInt(entry.getValue()); PaintOptions paintOptions = entry.getValue();
out.writeInt(paintOptions.color);
out.writeFloat(paintOptions.strokeWidth);
} }
} }
@ -211,8 +253,8 @@ public class MyCanvas extends View {
int size = in.readInt(); int size = in.readInt();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
MyPath key = (MyPath) in.readSerializable(); MyPath key = (MyPath) in.readSerializable();
int value = in.readInt(); PaintOptions paintOptions = new PaintOptions(in.readInt(), in.readFloat());
mPaths.put(key, value); mPaths.put(key, paintOptions);
} }
} }
} }

View File

@ -0,0 +1,17 @@
package com.simplemobiletools.draw;
import android.graphics.Color;
class PaintOptions {
int color = Color.BLACK;
float strokeWidth = 5f;
PaintOptions() {
//Empty constructor for instantiating with default values
}
PaintOptions(int color, float strokeWidth) {
this.color = color;
this.strokeWidth = strokeWidth;
}
}

View File

@ -19,6 +19,7 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast; import android.widget.Toast;
import com.simplemobiletools.draw.Config; import com.simplemobiletools.draw.Config;
@ -46,10 +47,12 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange
@BindView(R.id.my_canvas) MyCanvas mMyCanvas; @BindView(R.id.my_canvas) MyCanvas mMyCanvas;
@BindView(R.id.undo) View mUndoBtn; @BindView(R.id.undo) View mUndoBtn;
@BindView(R.id.color_picker) View mColorPicker; @BindView(R.id.color_picker) View mColorPicker;
@BindView(R.id.stroke_width_bar) SeekBar mStrokeWidthBar;
private String curFileName; private String curFileName;
private int color; private int color;
private float strokeWidth;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -57,15 +60,29 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
ButterKnife.bind(this); ButterKnife.bind(this);
mMyCanvas.setListener(this); mMyCanvas.setListener(this);
mStrokeWidthBar.setOnSeekBarChangeListener(onStrokeWidthBarChangeListener);
setBackgroundColor(mConfig.getBackgroundColor()); setBackgroundColor(mConfig.getBackgroundColor());
setColor(mConfig.getBrushColor()); setColor(mConfig.getBrushColor());
float savedStrokeWidth = mConfig.getStrokeWidth();
mMyCanvas.setStrokeWidth(savedStrokeWidth);
mStrokeWidthBar.setProgress((int) savedStrokeWidth);
}
@Override
protected void onResume() {
super.onResume();
boolean isStrokeWidthBarEnabled = mConfig.getIsStrokeWidthBarEnabled();
mStrokeWidthBar.setVisibility(isStrokeWidthBarEnabled ? View.VISIBLE : View.GONE);
mMyCanvas.setIsStrokeWidthBarEnabled(isStrokeWidthBarEnabled);
} }
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
mConfig.setBrushColor(color); mConfig.setBrushColor(color);
mConfig.setStrokeWidth(strokeWidth);
} }
@Override @Override
@ -290,4 +307,18 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange
public void pathsChanged(int cnt) { public void pathsChanged(int cnt) {
mUndoBtn.setVisibility(cnt > 0 ? View.VISIBLE : View.GONE); mUndoBtn.setVisibility(cnt > 0 ? View.VISIBLE : View.GONE);
} }
SeekBar.OnSeekBarChangeListener onStrokeWidthBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mMyCanvas.setStrokeWidth(progress);
strokeWidth = progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) { }
};
} }

View File

@ -13,6 +13,7 @@ import butterknife.OnClick;
public class SettingsActivity extends SimpleActivity { public class SettingsActivity extends SimpleActivity {
@BindView(R.id.settings_dark_theme) SwitchCompat mDarkThemeSwitch; @BindView(R.id.settings_dark_theme) SwitchCompat mDarkThemeSwitch;
@BindView(R.id.settings_brush_size) SwitchCompat mBrushSizeSwitch;
private static Config mConfig; private static Config mConfig;
@ -23,11 +24,12 @@ public class SettingsActivity extends SimpleActivity {
mConfig = Config.newInstance(getApplicationContext()); mConfig = Config.newInstance(getApplicationContext());
ButterKnife.bind(this); ButterKnife.bind(this);
setupDarkTheme(); setupSwitches();
} }
private void setupDarkTheme() { private void setupSwitches() {
mDarkThemeSwitch.setChecked(mConfig.getIsDarkTheme()); mDarkThemeSwitch.setChecked(mConfig.getIsDarkTheme());
mBrushSizeSwitch.setChecked(mConfig.getIsStrokeWidthBarEnabled());
} }
@OnClick(R.id.settings_dark_theme_holder) @OnClick(R.id.settings_dark_theme_holder)
@ -37,6 +39,12 @@ public class SettingsActivity extends SimpleActivity {
restartActivity(); restartActivity();
} }
@OnClick(R.id.settings_brush_size_holder)
public void handleBrushSize() {
mBrushSizeSwitch.setChecked(!mBrushSizeSwitch.isChecked());
mConfig.setIsStrokeWidthBarEnabled(mBrushSizeSwitch.isChecked());
}
private void restartActivity() { private void restartActivity() {
TaskStackBuilder.create(getApplicationContext()).addNextIntentWithParentStack(getIntent()).startActivities(); TaskStackBuilder.create(getApplicationContext()).addNextIntentWithParentStack(getIntent()).startActivities();
} }

View File

@ -26,4 +26,15 @@
android:src="@mipmap/undo_black" android:src="@mipmap/undo_black"
android:visibility="gone"/> android:visibility="gone"/>
<SeekBar
android:id="@+id/stroke_width_bar"
android:layout_width="@dimen/stroke_bar_size"
android:layout_height="wrap_content"
android:progress="5"
android:max="75"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="9dp"
android:visibility="gone"/>
</RelativeLayout> </RelativeLayout>

View File

@ -36,5 +36,31 @@
android:clickable="false"/> android:clickable="false"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout
android:id="@+id/settings_brush_size_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/settings_padding"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin">
<TextView
android:id="@+id/settings_brush_size_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/settings_padding"
android:text="@string/brush_size"/>
<android.support.v7.widget.SwitchCompat
android:id="@+id/settings_brush_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@null"
android:clickable="false"/>
</RelativeLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="dark_theme">Dunkles Design</string> <string name="dark_theme">Dunkles Design</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Leeren</string> <string name="clear">Leeren</string>
<string name="change_background">Change background</string> <string name="change_background">Change background</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Ajustes</string> <string name="settings">Ajustes</string>
<string name="dark_theme">Tema oscuro</string> <string name="dark_theme">Tema oscuro</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Limpiar</string> <string name="clear">Limpiar</string>
<string name="change_background">Cambiar fondo</string> <string name="change_background">Cambiar fondo</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Paramètres</string> <string name="settings">Paramètres</string>
<string name="dark_theme">Thème sombre</string> <string name="dark_theme">Thème sombre</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Tout effacer</string> <string name="clear">Tout effacer</string>
<string name="change_background">Changer le fond</string> <string name="change_background">Changer le fond</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Impostazioni</string> <string name="settings">Impostazioni</string>
<string name="dark_theme">Tema scuro</string> <string name="dark_theme">Tema scuro</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Clear</string> <string name="clear">Clear</string>
<string name="change_background">Change background</string> <string name="change_background">Change background</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">設定</string> <string name="settings">設定</string>
<string name="dark_theme">ダークテーマ</string> <string name="dark_theme">ダークテーマ</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">クリア</string> <string name="clear">クリア</string>
<string name="change_background">Change background</string> <string name="change_background">Change background</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Definições</string> <string name="settings">Definições</string>
<string name="dark_theme">Tema escuro</string> <string name="dark_theme">Tema escuro</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Limpar</string> <string name="clear">Limpar</string>
<string name="change_background">Alterar fundo</string> <string name="change_background">Alterar fundo</string>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Inställningar</string> <string name="settings">Inställningar</string>
<string name="dark_theme">Mörkt tema</string> <string name="dark_theme">Mörkt tema</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Clear</string> <string name="clear">Clear</string>
<string name="change_background">Change background</string> <string name="change_background">Change background</string>

View File

@ -5,6 +5,9 @@
<dimen name="social_padding">8dp</dimen> <dimen name="social_padding">8dp</dimen>
<dimen name="social_logo">40dp</dimen> <dimen name="social_logo">40dp</dimen>
<dimen name="settings_padding">8dp</dimen> <dimen name="settings_padding">8dp</dimen>
<dimen name="stroke_bar_size">150dp</dimen>
<dimen name="preview_dot_stroke_size">2dp</dimen>
<dimen name="preview_dot_offset_y">50dp</dimen>
<dimen name="normal_text_size">14sp</dimen> <dimen name="normal_text_size">14sp</dimen>
</resources> </resources>

View File

@ -16,6 +16,7 @@
<!-- Settings --> <!-- Settings -->
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="dark_theme">Dark theme</string> <string name="dark_theme">Dark theme</string>
<string name="brush_size">Show brush size tool</string>
<string name="clear">Clear</string> <string name="clear">Clear</string>
<string name="change_background">Change background</string> <string name="change_background">Change background</string>