Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
carrotech
doodle
提交
d0a21109
D
doodle
项目概览
carrotech
/
doodle
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
doodle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d0a21109
编写于
12月 28, 2018
作者:
H
hzw
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化交互逻辑
上级
a039bea1
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
321 addition
and
255 deletion
+321
-255
changes.md
changes.md
+4
-0
doodle/src/main/java/cn/hzw/doodle/DoodleActivity.java
doodle/src/main/java/cn/hzw/doodle/DoodleActivity.java
+64
-14
doodle/src/main/java/cn/hzw/doodle/DoodleOnTouchGestureListener.java
...main/java/cn/hzw/doodle/DoodleOnTouchGestureListener.java
+20
-21
doodle/src/main/java/cn/hzw/doodle/DoodlePath.java
doodle/src/main/java/cn/hzw/doodle/DoodlePath.java
+2
-1
doodle/src/main/java/cn/hzw/doodle/DoodleView.java
doodle/src/main/java/cn/hzw/doodle/DoodleView.java
+23
-6
doodle/src/main/res/layout/doodle_layout.xml
doodle/src/main/res/layout/doodle_layout.xml
+207
-213
doodle/src/main/res/values/dimen.xml
doodle/src/main/res/values/dimen.xml
+1
-0
未找到文件。
changes.md
0 → 100644
浏览文件 @
d0a21109
### V5.4
*
优化交互逻辑
*
支持左旋转
\ No newline at end of file
doodle/src/main/java/cn/hzw/doodle/DoodleActivity.java
浏览文件 @
d0a21109
...
...
@@ -12,6 +12,7 @@ import android.os.Bundle;
import
android.os.Environment
;
import
android.os.PersistableBundle
;
import
android.text.TextUtils
;
import
android.view.KeyEvent
;
import
android.view.MotionEvent
;
import
android.view.View
;
import
android.view.ViewGroup
;
...
...
@@ -112,9 +113,11 @@ public class DoodleActivity extends Activity {
private
TextView
mPaintSizeView
;
private
View
mBtnHidePanel
,
mSettingsPanel
;
private
View
mSelected
Text
EditContainer
;
private
View
mBtnColor
;
private
View
mSelectedEditContainer
;
private
View
mBtnColor
,
mColorContainer
;
private
SeekBar
mEditSizeSeekBar
;
private
View
mShapeContainer
,
mPenContainer
,
mSizeContainer
;
private
View
mBtnUndo
;
private
AlphaAnimation
mViewShowAnimation
,
mViewHideAnimation
;
// view隐藏和显示时用到的渐变动画
...
...
@@ -174,7 +177,7 @@ public class DoodleActivity extends Activity {
setContentView
(
R
.
layout
.
doodle_layout
);
mFrameLayout
=
(
FrameLayout
)
findViewById
(
R
.
id
.
doodle_container
);
mDoodle
=
mDoodleView
=
new
Dood
el
ViewWrapper
(
this
,
bitmap
,
new
IDoodleListener
()
{
mDoodle
=
mDoodleView
=
new
Dood
le
ViewWrapper
(
this
,
bitmap
,
new
IDoodleListener
()
{
@Override
public
void
onSaved
(
IDoodle
doodle
,
Bitmap
bitmap
,
Runnable
callback
)
{
// 保存图片为jpg格式
File
doodleFile
=
null
;
...
...
@@ -251,17 +254,22 @@ public class DoodleActivity extends Activity {
@Override
public
void
onSelectedItem
(
IDoodle
doodle
,
IDoodleSelectableItem
selectableItem
,
boolean
selected
)
{
if
(
selected
)
{
mDoodleView
.
setEditMode
(
true
);
// mDoodle.setPen(selectableItem.getPen()); // don't set!!!!! it will make selectedItem null
mDoodle
.
setColor
(
selectableItem
.
getColor
());
mDoodle
.
setSize
(
selectableItem
.
getSize
());
mEditSizeSeekBar
.
setProgress
((
int
)
selectableItem
.
getSize
());
mSelectedTextEditContainer
.
setVisibility
(
View
.
VISIBLE
);
if
(
doodle
.
getPen
()
==
DoodlePen
.
TEXT
||
doodle
.
getPen
()
==
DoodlePen
.
BITMAP
)
{
findViewById
(
R
.
id
.
doodle_selectable_edit
).
setVisibility
(
View
.
VISIBLE
);
mSelectedEditContainer
.
setVisibility
(
View
.
VISIBLE
);
mSizeContainer
.
setVisibility
(
View
.
VISIBLE
);
if
(
selectableItem
.
getPen
()
==
DoodlePen
.
TEXT
||
selectableItem
.
getPen
()
==
DoodlePen
.
BITMAP
)
{
findViewById
(
R
.
id
.
doodle_selectable_edit
).
setVisibility
(
View
.
VISIBLE
);
// edit btn
mColorContainer
.
setVisibility
(
View
.
GONE
);
}
else
{
findViewById
(
R
.
id
.
doodle_selectable_edit
).
setVisibility
(
View
.
GONE
);
mColorContainer
.
setVisibility
(
View
.
VISIBLE
);
}
}
else
{
mSelected
Text
EditContainer
.
setVisibility
(
View
.
GONE
);
mSelectedEditContainer
.
setVisibility
(
View
.
GONE
);
}
}
...
...
@@ -341,7 +349,8 @@ public class DoodleActivity extends Activity {
//
private
void
initView
()
{
findViewById
(
R
.
id
.
btn_undo
).
setOnLongClickListener
(
new
View
.
OnLongClickListener
()
{
mBtnUndo
=
findViewById
(
R
.
id
.
btn_undo
);
mBtnUndo
.
setOnLongClickListener
(
new
View
.
OnLongClickListener
()
{
@Override
public
boolean
onLongClick
(
View
v
)
{
if
(!(
DoodleParams
.
getDialogInterceptor
()
!=
null
...
...
@@ -359,15 +368,19 @@ public class DoodleActivity extends Activity {
return
true
;
}
});
mSelected
Text
EditContainer
=
findViewById
(
R
.
id
.
doodle_selectable_edit_container
);
mSelectedEditContainer
=
findViewById
(
R
.
id
.
doodle_selectable_edit_container
);
mSettingsPanel
=
findViewById
(
R
.
id
.
doodle_panel
);
mBtnHidePanel
=
findViewById
(
R
.
id
.
doodle_btn_hide_panel
);
mPaintSizeView
=
(
TextView
)
findViewById
(
R
.
id
.
paint_size_text
);
mShapeContainer
=
findViewById
(
R
.
id
.
shape_container
);
mPenContainer
=
findViewById
(
R
.
id
.
pen_container
);
mSizeContainer
=
findViewById
(
R
.
id
.
size_container
);
mBtnColor
=
DoodleActivity
.
this
.
findViewById
(
R
.
id
.
btn_set_color
);
mColorContainer
=
DoodleActivity
.
this
.
findViewById
(
R
.
id
.
btn_set_color_container
);
mEditSizeSeekBar
=
findViewById
(
R
.
id
.
doodle_seekbar_size
);
mEditSizeSeekBar
.
setOnSeekBarChangeListener
(
new
SeekBar
.
OnSeekBarChangeListener
()
{
@Override
...
...
@@ -376,7 +389,7 @@ public class DoodleActivity extends Activity {
mEditSizeSeekBar
.
setProgress
(
1
);
return
;
}
if
((
int
)
mDoodle
.
getSize
()
==
progress
)
{
if
((
int
)
mDoodle
.
getSize
()
==
progress
)
{
return
;
}
mDoodle
.
setSize
(
progress
);
...
...
@@ -603,6 +616,17 @@ public class DoodleActivity extends Activity {
}
}
public
boolean
onKeyDown
(
int
keyCode
,
KeyEvent
event
)
{
if
(
keyCode
==
KeyEvent
.
KEYCODE_BACK
)
{
if
(
mDoodleView
.
isEditMode
())
{
mDoodleView
.
setEditMode
(
false
);
return
true
;
}
}
return
super
.
onKeyDown
(
keyCode
,
event
);
}
@Override
public
void
onBackPressed
()
{
// 返回键监听
findViewById
(
R
.
id
.
doodle_btn_back
).
performClick
();
...
...
@@ -630,13 +654,13 @@ public class DoodleActivity extends Activity {
/**
* 包裹DoodleView,监听相应的设置接口,以改变UI状态
*/
private
class
Dood
el
ViewWrapper
extends
DoodleView
{
private
class
Dood
le
ViewWrapper
extends
DoodleView
{
public
Dood
el
ViewWrapper
(
Context
context
,
Bitmap
bitmap
,
IDoodleListener
listener
)
{
public
Dood
le
ViewWrapper
(
Context
context
,
Bitmap
bitmap
,
IDoodleListener
listener
)
{
super
(
context
,
bitmap
,
listener
);
}
public
Dood
el
ViewWrapper
(
Context
context
,
Bitmap
bitmap
,
IDoodleListener
listener
,
IDoodleTouchDetector
defaultDetector
)
{
public
Dood
le
ViewWrapper
(
Context
context
,
Bitmap
bitmap
,
IDoodleListener
listener
,
IDoodleTouchDetector
defaultDetector
)
{
super
(
context
,
bitmap
,
listener
,
defaultDetector
);
}
...
...
@@ -686,6 +710,14 @@ public class DoodleActivity extends Activity {
mDoodle
.
setColor
(
new
DoodleColor
(((
BitmapDrawable
)
colorBg
).
getBitmap
()));
}
}
if
(
pen
==
DoodlePen
.
BITMAP
||
pen
==
DoodlePen
.
TEXT
)
{
mShapeContainer
.
setVisibility
(
GONE
);
mColorContainer
.
setVisibility
(
GONE
);
}
else
{
mShapeContainer
.
setVisibility
(
VISIBLE
);
mColorContainer
.
setVisibility
(
VISIBLE
);
}
}
private
Map
<
IDoodleShape
,
Integer
>
mBtnShapeIds
=
new
HashMap
<>();
...
...
@@ -720,6 +752,7 @@ public class DoodleActivity extends Activity {
public
void
setColor
(
IDoodleColor
color
)
{
if
(
getPen
()
==
DoodlePen
.
COPY
||
getPen
()
==
DoodlePen
.
ERASER
)
{
if
((
getColor
()
instanceof
DoodleColor
)
&&
((
DoodleColor
)
getColor
()).
getBitmap
()
==
mDoodle
.
getBitmap
())
{
// nothing
}
else
{
super
.
setColor
(
new
DoodleColor
(
mDoodle
.
getBitmap
()));
}
...
...
@@ -731,7 +764,9 @@ public class DoodleActivity extends Activity {
if
(
color
instanceof
DoodleColor
)
{
doodleColor
=
(
DoodleColor
)
color
;
}
if
(
doodleColor
!=
null
)
{
if
(
doodleColor
!=
null
&&
mTouchGestureListener
.
getSelectedItem
()
!=
null
&&
mTouchGestureListener
.
getSelectedItem
().
getPen
()
!=
DoodlePen
.
BITMAP
)
{
if
(
doodleColor
.
getType
()
==
DoodleColor
.
Type
.
COLOR
)
{
mBtnColor
.
setBackgroundColor
(
doodleColor
.
getColor
());
}
else
if
(
doodleColor
.
getType
()
==
DoodleColor
.
Type
.
BITMAP
)
{
...
...
@@ -769,8 +804,23 @@ public class DoodleActivity extends Activity {
mBtnEditMode
.
setSelected
(
editMode
);
if
(
editMode
)
{
Toast
.
makeText
(
DoodleActivity
.
this
,
R
.
string
.
doodle_edit_mode
,
Toast
.
LENGTH_SHORT
).
show
();
mPenContainer
.
setVisibility
(
GONE
);
mShapeContainer
.
setVisibility
(
GONE
);
mSizeContainer
.
setVisibility
(
GONE
);
mColorContainer
.
setVisibility
(
GONE
);
mBtnUndo
.
setVisibility
(
GONE
);
}
else
{
mTouchGestureListener
.
setSelectedItem
(
null
);
mPenContainer
.
setVisibility
(
VISIBLE
);
mSizeContainer
.
setVisibility
(
VISIBLE
);
if
(
getPen
()
==
DoodlePen
.
BITMAP
||
getPen
()
==
DoodlePen
.
TEXT
)
{
mShapeContainer
.
setVisibility
(
GONE
);
mColorContainer
.
setVisibility
(
GONE
);
}
else
{
mShapeContainer
.
setVisibility
(
VISIBLE
);
mColorContainer
.
setVisibility
(
VISIBLE
);
}
mBtnUndo
.
setVisibility
(
VISIBLE
);
}
}
...
...
doodle/src/main/java/cn/hzw/doodle/DoodleOnTouchGestureListener.java
浏览文件 @
d0a21109
...
...
@@ -209,7 +209,7 @@ public class DoodleOnTouchGestureListener extends TouchGestureDetector.OnTouchGe
return
true
;
}
// 判断当前画笔是否可编辑
,前提必须跟当前涂鸦框架选中的画笔相同,以此在非编辑模式下只有当前画笔类型的可编辑
// 判断当前画笔是否可编辑
private
boolean
isPenEditable
(
IDoodlePen
pen
)
{
return
(
mDoodle
.
getPen
()
==
DoodlePen
.
TEXT
&&
pen
==
DoodlePen
.
TEXT
)
||
(
mDoodle
.
getPen
()
==
DoodlePen
.
BITMAP
&&
pen
==
DoodlePen
.
BITMAP
);
...
...
@@ -222,45 +222,44 @@ public class DoodleOnTouchGestureListener extends TouchGestureDetector.OnTouchGe
mTouchX
=
e
.
getX
();
mTouchY
=
e
.
getY
();
boolean
penEditable
=
isPenEditable
(
mDoodle
.
getPen
());
if
(
mDoodle
.
isEditMode
()
||
penEditable
)
{
if
(
mDoodle
.
isEditMode
())
{
boolean
found
=
false
;
IDoodleSelectableItem
item
;
List
<
IDoodleItem
>
items
=
mDoodle
.
getAllItem
();
for
(
int
i
=
items
.
size
()
-
1
;
i
>=
0
;
i
--)
{
IDoodleItem
elem
=
items
.
get
(
i
);
if
(!
(
elem
instanceof
IDoodleSelectableItem
)
||
!
elem
.
isDoodleEditable
())
{
if
(!
elem
.
isDoodleEditable
())
{
continue
;
}
if
(!(
elem
instanceof
IDoodleSelectableItem
))
{
continue
;
}
item
=
(
IDoodleSelectableItem
)
elem
;
if
(
mDoodle
.
isEditMode
()
||
penEditable
&&
isPenEditable
(
item
.
getPen
()))
{
// 非编辑模式下必须保证画笔是可编辑的类型
if
(
item
.
contains
(
mDoodle
.
toX
(
mTouchX
),
mDoodle
.
toY
(
mTouchY
)))
{
found
=
true
;
setSelectedItem
(
item
);
PointF
xy
=
item
.
getLocation
();
mSelectedItemX
=
xy
.
x
;
mSelectedItemY
=
xy
.
y
;
break
;
}
if
(
item
.
contains
(
mDoodle
.
toX
(
mTouchX
),
mDoodle
.
toY
(
mTouchY
)))
{
found
=
true
;
setSelectedItem
(
item
);
PointF
xy
=
item
.
getLocation
();
mSelectedItemX
=
xy
.
x
;
mSelectedItemY
=
xy
.
y
;
break
;
}
}
if
(!
found
)
{
if
(!
found
)
{
// not found
if
(
mSelectedItem
!=
null
)
{
// 取消选定
IDoodleSelectableItem
old
=
mSelectedItem
;
setSelectedItem
(
null
);
if
(
mSelectionListener
!=
null
)
{
mSelectionListener
.
onSelectedItem
(
mDoodle
,
old
,
false
);
}
}
else
{
if
(!
mDoodle
.
isEditMode
()
// 编辑模式下不能添加item
&&
mSelectionListener
!=
null
)
{
mSelectionListener
.
onCreateSelectableItem
(
mDoodle
,
mDoodle
.
toX
(
mTouchX
),
mDoodle
.
toY
(
mTouchY
));
}
}
}
}
else
if
(
isPenEditable
(
mDoodle
.
getPen
()))
{
if
(
mSelectionListener
!=
null
)
{
mSelectionListener
.
onCreateSelectableItem
(
mDoodle
,
mDoodle
.
toX
(
mTouchX
),
mDoodle
.
toY
(
mTouchY
));
}
}
else
{
// 模拟一次滑动
onScrollBegin
(
e
);
...
...
doodle/src/main/java/cn/hzw/doodle/DoodlePath.java
浏览文件 @
d0a21109
...
...
@@ -165,9 +165,10 @@ public class DoodlePath extends DoodleRotatableItemBase {
@Override
public
boolean
isDoodleEditable
()
{
if
(
getPen
()
==
DoodlePen
.
ERASER
)
{
if
(
getPen
()
==
DoodlePen
.
ERASER
)
{
// eraser is not editable
return
false
;
}
return
super
.
isDoodleEditable
();
}
...
...
doodle/src/main/java/cn/hzw/doodle/DoodleView.java
浏览文件 @
d0a21109
...
...
@@ -13,6 +13,8 @@ import android.os.Looper;
import
android.view.MotionEvent
;
import
android.view.View
;
import
junit.framework.Assert
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -536,13 +538,16 @@ public class DoodleView extends View implements IDoodle {
/**
* 相对于初始图片旋转的角度
*
* @param degree
* @param degree
positive degree means rotate right, negative degree means rotate left
*/
@Override
public
void
setDoodleRotation
(
int
degree
)
{
mDoodleRotateDegree
=
degree
;
mDoodleRotateDegree
=
mDoodleRotateDegree
%
360
;
if
(
mDoodleRotateDegree
<
0
)
{
mDoodleRotateDegree
=
360
+
mDoodleRotateDegree
;
}
// 居中
RectF
rectF
=
getDoodleBound
();
...
...
@@ -848,6 +853,10 @@ public class DoodleView extends View implements IDoodle {
@Override
public
void
topItem
(
IDoodleItem
item
)
{
if
(
item
==
null
)
{
throw
new
RuntimeException
(
"item is null"
);
}
mItemStack
.
remove
(
item
);
mItemStack
.
add
(
item
);
refresh
();
...
...
@@ -855,6 +864,10 @@ public class DoodleView extends View implements IDoodle {
@Override
public
void
bottomItem
(
IDoodleItem
item
)
{
if
(
item
==
null
)
{
throw
new
RuntimeException
(
"item is null"
);
}
mItemStack
.
remove
(
item
);
mItemStack
.
add
(
0
,
item
);
refresh
();
...
...
@@ -888,15 +901,19 @@ public class DoodleView extends View implements IDoodle {
}
@Override
public
void
addItem
(
IDoodleItem
doodleItem
)
{
if
(
this
!=
doodleItem
.
getDoodle
())
{
public
void
addItem
(
IDoodleItem
item
)
{
if
(
item
==
null
)
{
throw
new
RuntimeException
(
"item is null"
);
}
if
(
this
!=
item
.
getDoodle
())
{
throw
new
RuntimeException
(
"the object Doodle is illegal"
);
}
if
(
mItemStack
.
contains
(
doodleI
tem
))
{
if
(
mItemStack
.
contains
(
i
tem
))
{
throw
new
RuntimeException
(
"the item has been added"
);
}
mItemStack
.
add
(
doodleI
tem
);
doodleI
tem
.
onAdd
();
mItemStack
.
add
(
i
tem
);
i
tem
.
onAdd
();
refresh
();
}
...
...
doodle/src/main/res/layout/doodle_layout.xml
浏览文件 @
d0a21109
此差异已折叠。
点击以展开。
doodle/src/main/res/values/dimen.xml
浏览文件 @
d0a21109
...
...
@@ -3,4 +3,5 @@
<dimen
name=
"doodle_title_bar_height"
>
50dp
</dimen>
<dimen
name=
"doodle_btn_pen_size"
>
32dp
</dimen>
<dimen
name=
"doodle_btn_shape_size"
>
30dp
</dimen>
<dimen
name=
"doodle_margin"
>
5dp
</dimen>
</resources>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录