Skip to content

Commit

Permalink
add icons and path round.
Browse files Browse the repository at this point in the history
  • Loading branch information
minetsh committed Dec 3, 2017
1 parent fa2d854 commit d478c51
Show file tree
Hide file tree
Showing 73 changed files with 877 additions and 55 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong
Expand Down
5 changes: 4 additions & 1 deletion image/src/main/AndroidManifest.xml
Expand Up @@ -5,7 +5,10 @@

<activity android:name=".ImageGalleryActivity" />

<activity android:name=".ImageEditActivity" />
<activity
android:name=".ImageEditActivity"
android:theme="@style/ImageEditTheme"
android:windowSoftInputMode="stateAlwaysHidden" />

</application>

Expand Down
49 changes: 34 additions & 15 deletions image/src/main/java/com/xingren/imaging/ImageEditActivity.java
Expand Up @@ -7,21 +7,29 @@
import android.widget.ViewSwitcher;

import com.xingren.imaging.core.IMGMode;
import com.xingren.imaging.core.IMGText;
import com.xingren.imaging.view.IMGStickerTextView;
import com.xingren.imaging.view.IMGView;

/**
* Created by felix on 2017/11/14 下午2:26.
*/

public class ImageEditActivity extends Activity implements View.OnClickListener {
public class ImageEditActivity extends Activity implements View.OnClickListener,
ImageTextDialog.Callback {

private IMGView mImageView;

private RadioGroup mModeGroup;

private ViewSwitcher mClipSwitcher;

private ImageTextDialog mTextDialog;

private ViewSwitcher mPathOpSwitcher;

private View mDoodleAndMosaicLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -31,28 +39,28 @@ protected void onCreate(Bundle savedInstanceState) {
mClipSwitcher = findViewById(R.id.vs_edit_op);

mModeGroup = findViewById(R.id.rg_modes);
findViewById(R.id.rb_a).setOnClickListener(this);
findViewById(R.id.rb_b).setOnClickListener(this);
findViewById(R.id.rb_c).setOnClickListener(this);
findViewById(R.id.rb_d).setOnClickListener(this);

mDoodleAndMosaicLayout = findViewById(R.id.layout_dm_op);
mPathOpSwitcher = findViewById(R.id.vs_dm_op);

mImageView = findViewById(R.id.image_canvas);

IMGStickerTextView sticker = new IMGStickerTextView(getApplicationContext());

mImageView.addStickerView(sticker);

}

@Override
public void onClick(View v) {
int vid = v.getId();
if (vid == R.id.rb_a) {
if (vid == R.id.rb_doodle) {
onModeClick(IMGMode.DOODLE);
} else if (vid == R.id.rb_b) {
} else if (vid == R.id.btn_text) {
onTextClick();
} else if (vid == R.id.rb_c) {
} else if (vid == R.id.rb_mosaic) {
onModeClick(IMGMode.MOSAIC);
} else if (vid == R.id.rb_d) {
} else if (vid == R.id.btn_clip) {
onModeClick(IMGMode.CLIP);
}
}
Expand All @@ -71,24 +79,35 @@ private void onModeClick(IMGMode mode) {
}

private void onTextClick() {
// TODO
if (mTextDialog == null) {
mTextDialog = new ImageTextDialog(this, this);
}
mTextDialog.reset();
mTextDialog.show();
}

private void updateModeUI() {
IMGMode mode = mImageView.getMode();
switch (mode) {
case DOODLE:
mModeGroup.check(R.id.rb_a);
mModeGroup.check(R.id.rb_doodle);
mPathOpSwitcher.setDisplayedChild(0);
mDoodleAndMosaicLayout.setVisibility(View.VISIBLE);
break;
case MOSAIC:
mModeGroup.check(R.id.rb_c);
break;
case CLIP:
mModeGroup.check(R.id.rb_d);
mModeGroup.check(R.id.rb_mosaic);
mPathOpSwitcher.setDisplayedChild(1);
mDoodleAndMosaicLayout.setVisibility(View.VISIBLE);
break;
case NONE:
mModeGroup.clearCheck();
mDoodleAndMosaicLayout.setVisibility(View.INVISIBLE);
break;
}
}

@Override
public void onText(IMGText text) {
mImageView.addStickerText(text);
}
}
107 changes: 107 additions & 0 deletions image/src/main/java/com/xingren/imaging/ImageTextDialog.java
@@ -0,0 +1,107 @@
package com.xingren.imaging;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.EditText;
import android.widget.RadioGroup;

import com.xingren.imaging.core.IMGText;
import com.xingren.imaging.view.IMGColorGroup;

/**
* Created by felix on 2017/12/1 上午11:21.
*/

public class ImageTextDialog extends Dialog implements View.OnClickListener,
RadioGroup.OnCheckedChangeListener {

private static final String TAG = "ImageTextDialog";

private EditText mEditText;

private Callback mCallback;

private IMGText mDefaultText;

private IMGColorGroup mColorGroup;

public ImageTextDialog(Context context, Callback callback) {
super(context, R.style.ImageTextDialog);
setContentView(R.layout.image_text_dialog);
mCallback = callback;
Window window = getWindow();
if (window != null) {
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mColorGroup = findViewById(R.id.cg_colors);
mColorGroup.setOnCheckedChangeListener(this);
mEditText = findViewById(R.id.et_text);

findViewById(R.id.tv_cancel).setOnClickListener(this);
findViewById(R.id.tv_done).setOnClickListener(this);
}

@Override
protected void onStart() {
super.onStart();
if (mDefaultText != null) {
setText(mDefaultText);
mDefaultText = null;
}
mColorGroup.setCheckColor(mEditText.getCurrentTextColor());
}

public void setText(IMGText text) {
if (mEditText != null) {
mEditText.setText(text.getText());
mEditText.setTextColor(text.getColor());
if (!text.isEmpty()) {
mEditText.setSelection(mEditText.length());
}
} else mDefaultText = text;
}

public void reset() {
setText(new IMGText(null, Color.WHITE));
}

@Override
public void onClick(View v) {
int vid = v.getId();
if (vid == R.id.tv_done) {
onDone();
} else if (vid == R.id.tv_cancel) {
dismiss();
}
}

private void onDone() {
String text = mEditText.getText().toString();
if (!TextUtils.isEmpty(text) && mCallback != null) {
mCallback.onText(new IMGText(text, mEditText.getCurrentTextColor()));
}
dismiss();
}

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
mEditText.setTextColor(mColorGroup.getCheckColor());
}

public interface Callback {

void onText(IMGText text);
}
}
2 changes: 1 addition & 1 deletion image/src/main/java/com/xingren/imaging/core/IMGImage.java
Expand Up @@ -53,7 +53,7 @@ public class IMGImage {
/**
* 编辑模式
*/
private IMGMode mMode = IMGMode.CLIP;
private IMGMode mMode = IMGMode.NONE;

private float mWindowPivotX, mWindowPivotY;

Expand Down
11 changes: 10 additions & 1 deletion image/src/main/java/com/xingren/imaging/core/IMGPath.java
Expand Up @@ -2,6 +2,7 @@

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
Expand All @@ -23,17 +24,26 @@ public class IMGPath {
static {
P.setStyle(Paint.Style.STROKE);
P.setStrokeWidth(20f);
P.setPathEffect(new CornerPathEffect(20));
P.setStrokeCap(Paint.Cap.ROUND);
P.setStrokeJoin(Paint.Join.ROUND);
}

public IMGPath(Path path, IMGMode mode, int color) {
this.path = path;
this.mode = mode;
this.color = color;
if (mode == IMGMode.MOSAIC) {
path.setFillType(Path.FillType.EVEN_ODD);
}
}

public IMGPath(Path path, IMGMode mode) {
this.path = path;
this.mode = mode;
if (mode == IMGMode.MOSAIC) {
path.setFillType(Path.FillType.EVEN_ODD);
}
}

public void onDraw(Canvas canvas) {
Expand All @@ -52,7 +62,6 @@ private void onDrawDoodle(Canvas canvas) {

private void onDrawMosaic(Canvas canvas) {
P.setColor(Color.BLACK);
path.setFillType(Path.FillType.EVEN_ODD);
canvas.drawPath(path, P);
}

Expand Down
52 changes: 52 additions & 0 deletions image/src/main/java/com/xingren/imaging/core/IMGText.java
@@ -0,0 +1,52 @@
package com.xingren.imaging.core;

import android.graphics.Color;
import android.text.TextUtils;

/**
* Created by felix on 2017/12/1 下午2:43.
*/

public class IMGText {

private String text;

private int color = Color.WHITE;

public IMGText(String text, int color) {
this.text = text;
this.color = color;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public int getColor() {
return color;
}

public void setColor(int color) {
this.color = color;
}

public boolean isEmpty() {
return TextUtils.isEmpty(text);
}

public int length() {
return isEmpty() ? 0 : text.length();
}

@Override
public String toString() {
return "IMGText{" +
"text='" + text + '\'' +
", color=" + color +
'}';
}
}
41 changes: 41 additions & 0 deletions image/src/main/java/com/xingren/imaging/view/IMGColorGroup.java
@@ -0,0 +1,41 @@
package com.xingren.imaging.view;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.RadioGroup;

/**
* Created by felix on 2017/12/1 下午3:07.
*/

public class IMGColorGroup extends RadioGroup {

public IMGColorGroup(Context context) {
super(context);
}

public IMGColorGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}

public int getCheckColor() {
int checkedId = getCheckedRadioButtonId();
IMGColorRadio radio = findViewById(checkedId);
if (radio != null) {
return radio.getColor();
}
return Color.WHITE;
}

public void setCheckColor(int color) {
int count = getChildCount();
for (int i = 0; i < count; i++) {
IMGColorRadio radio = (IMGColorRadio) getChildAt(i);
if (radio.getColor() == color) {
radio.setChecked(true);
break;
}
}
}
}

0 comments on commit d478c51

Please sign in to comment.