Skip to content

Commit ddbe41b

Browse files
committed
优化了手势操作体验
1 parent 7d4552d commit ddbe41b

File tree

2 files changed

+86
-38
lines changed

2 files changed

+86
-38
lines changed

.gitignore

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,36 @@
1-
.idea
2-
*.iml
3-
*.class
1+
# Gradle
2+
.gradle
3+
gradlew.bat
4+
build
5+
local.properties
6+
reports
7+
8+
# Maven
9+
target
10+
pom.xml.*
11+
release.properties
12+
gen-external-apklibs
13+
14+
# Eclipse
415
.classpath
516
.project
6-
.setting
7-
bin
17+
.settings
18+
eclipsebin
19+
20+
# IntelliJ IDEA
21+
.idea
22+
*.iml
23+
*.ipl
24+
*.iws
25+
classes/
26+
idea-classes/
27+
coverage-error.log
28+
29+
# Android
830
gen
31+
bin
32+
project.properties
933
out
10-
.gradle
11-
build
12-
local.properties
13-
gradle
1434

35+
# Finder
36+
.DS_Store

GraffitiLib/src/main/java/cn/hzw/graffiti/GraffitiActivity.java

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.app.Activity;
44
import android.app.AlertDialog;
5-
import android.content.Context;
65
import android.content.DialogInterface;
76
import android.content.Intent;
87
import android.graphics.Bitmap;
@@ -12,6 +11,7 @@
1211
import android.os.Environment;
1312
import android.view.MotionEvent;
1413
import android.view.View;
14+
import android.view.ViewConfiguration;
1515
import android.view.ViewGroup;
1616
import android.view.Window;
1717
import android.widget.FrameLayout;
@@ -27,15 +27,18 @@
2727
import cn.forward.androids.utils.ThreadUtil;
2828

2929
/**
30+
* 涂鸦界面,根据GraffitiView的接口,提供页面交互
31+
* (这边代码和ui比较粗糙,主要目的是告诉大家GraffitiView的接口具体能实现什么功能,实际需求中的ui和交互需另提别论)
3032
* Created by huangziwei on 2016/9/3.
3133
*/
3234
public class GraffitiActivity extends Activity {
3335

3436

3537
/**
3638
* 启动涂鸦界面
39+
*
3740
* @param activity
38-
* @param imagePath 图片路径
41+
* @param imagePath 图片路径
3942
* @param requestCode startActivityForResult的请求码
4043
*/
4144
public static void startActivityForResult(Activity activity, String imagePath, int requestCode) {
@@ -62,16 +65,25 @@ public static void startActivityForResult(Activity activity, String imagePath, i
6265
private int mTouchMode;
6366
private boolean mIsMovingPic = false;
6467

65-
private float mOldDist, mNewDist, mToucheCentreXOnGraffiti,
68+
// 手势操作相关
69+
private float mOldScale, mOldDist, mNewDist, mToucheCentreXOnGraffiti,
6670
mToucheCentreYOnGraffiti, mTouchCentreX, mTouchCentreY;// 双指距离
71+
6772
private float mTouchLastX, mTouchLastY;
6873

6974
private boolean mIsScaling = false;
7075
private float mScale = 1;
71-
private final float mMaxScale = 3.5f;
72-
private final int TIME_SPAN = 80;
76+
private final float mMaxScale = 3.5f; // 最大缩放倍数
77+
private final float mMinScale = 0.25f; // 最小缩放倍数
78+
private final int TIME_SPAN = 40;
7379
private View mBtnMovePic;
7480

81+
private int mTouchSlop;
82+
83+
// 当前屏幕中心点对应在GraffitiView中的点的坐标
84+
float mCenterXOnGraffiti;
85+
float mCenterYOnGraffiti;
86+
7587
@Override
7688
public void onCreate(Bundle savedInstanceState) {
7789
super.onCreate(savedInstanceState);
@@ -127,12 +139,7 @@ public void onError(int i, String msg) {
127139
});
128140
mFrameLayout.addView(mGraffitiView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
129141
mOnClickListener = new GraffitiOnClickListener();
130-
131-
mUpdateScale = new Runnable() {
132-
public void run() {
133-
mGraffitiView.setScale(mScale);
134-
}
135-
};
142+
mTouchSlop = ViewConfiguration.get(getApplicationContext()).getScaledTouchSlop();
136143
initView();
137144
}
138145

@@ -223,19 +230,19 @@ public boolean onTouch(View v, MotionEvent event) {
223230
mTouchLastY = event.getY();
224231
} else { // 多点
225232
mNewDist = spacing(event);// 两点滑动时的距离
226-
if (Math.abs(mNewDist - mOldDist) >= 2000) {
227-
if (mNewDist - mOldDist > 0) {// 拉大
228-
mScale += 0.05f;
229-
if (mScale > mMaxScale) {
230-
mScale = mMaxScale;
231-
}
232-
} else {// 拉小
233-
mScale -= 0.05f;
234-
if (mScale < 0.5f) {
235-
mScale = 0.5f;
236-
}
233+
if (Math.abs(mNewDist - mOldDist) >= mTouchSlop) {
234+
float scale = mNewDist / mOldDist;
235+
mScale = mOldScale * scale;
236+
237+
if (mScale > mMaxScale) {
238+
mScale = mMaxScale;
237239
}
240+
if (mScale < mMinScale) { // 最小倍数
241+
mScale = mMinScale;
242+
}
243+
// 围绕坐标(0,0)缩放图片
238244
mGraffitiView.setScale(mScale);
245+
// 缩放后,偏移图片,以产生围绕某个点缩放的效果
239246
float transX = mGraffitiView.toTransX(mTouchCentreX, mToucheCentreXOnGraffiti);
240247
float transY = mGraffitiView.toTransY(mTouchCentreY, mToucheCentreYOnGraffiti);
241248
mGraffitiView.setTrans(transX, transY);
@@ -247,6 +254,7 @@ public boolean onTouch(View v, MotionEvent event) {
247254
return true;
248255
case MotionEvent.ACTION_POINTER_DOWN:
249256
mTouchMode += 1;
257+
mOldScale = mGraffitiView.getScale();
250258
mOldDist = spacing(event);// 两点按下时的距离
251259
mTouchCentreX = (event.getX(0) + event.getX(1)) / 2;// 不用减trans
252260
mTouchCentreY = (event.getY(0) + event.getY(1)) / 2;
@@ -269,7 +277,7 @@ public boolean onTouch(View v, MotionEvent event) {
269277
private float spacing(MotionEvent event) {
270278
float x = event.getX(0) - event.getX(1);
271279
float y = event.getY(0) - event.getY(1);
272-
return x * x + y * y;
280+
return (float) Math.sqrt(x * x + y * y);
273281
}
274282

275283
private class GraffitiOnClickListener implements View.OnClickListener {
@@ -443,11 +451,16 @@ public void scalePic(View v) {
443451
return;
444452
mIsScaling = true;
445453
mScale = mGraffitiView.getScale();
446-
if (v.getId() == R.id.btn_amplifier) {
454+
455+
// 确定当前屏幕中心点对应在GraffitiView中的点的坐标,之后将围绕这个点缩放
456+
mCenterXOnGraffiti = mGraffitiView.toX(mGraffitiView.getWidth() / 2);
457+
mCenterYOnGraffiti = mGraffitiView.toY(mGraffitiView.getHeight() / 2);
458+
459+
if (v.getId() == R.id.btn_amplifier) { // 放大
447460
ThreadUtil.getInstance().runOnAsyncThread(new Runnable() {
448461
public void run() {
449462
do {
450-
mScale += 0.1f;
463+
mScale += 0.05f;
451464
if (mScale > mMaxScale) {
452465
mScale = mMaxScale;
453466
mIsScaling = false;
@@ -462,13 +475,13 @@ public void run() {
462475

463476
}
464477
});
465-
} else if (v.getId() == R.id.btn_reduce) {
478+
} else if (v.getId() == R.id.btn_reduce) { // 缩小
466479
ThreadUtil.getInstance().runOnAsyncThread(new Runnable() {
467480
public void run() {
468481
do {
469-
mScale -= 0.1f;
470-
if (mScale < 0.5f) {
471-
mScale = 0.5f;
482+
mScale -= 0.05f;
483+
if (mScale < mMinScale) {
484+
mScale = mMinScale;
472485
mIsScaling = false;
473486
}
474487
updateScale();
@@ -484,6 +497,19 @@ public void run() {
484497
}
485498

486499
private void updateScale() {
500+
if (mUpdateScale == null) {
501+
502+
mUpdateScale = new Runnable() {
503+
public void run() {
504+
// 围绕坐标(0,0)缩放图片
505+
mGraffitiView.setScale(mScale);
506+
// 缩放后,偏移图片,以产生围绕某个点缩放的效果
507+
float transX = mGraffitiView.toTransX(mGraffitiView.getWidth() / 2, mCenterXOnGraffiti);
508+
float transY = mGraffitiView.toTransY(mGraffitiView.getHeight() / 2, mCenterYOnGraffiti);
509+
mGraffitiView.setTrans(transX, transY);
510+
}
511+
};
512+
}
487513
ThreadUtil.getInstance().runOnMainThread(mUpdateScale);
488514
}
489515
}

0 commit comments

Comments
 (0)