23
23
import android .support .v4 .app .ActivityCompat ;
24
24
import android .support .v4 .content .ContextCompat ;
25
25
import android .support .v7 .app .AppCompatActivity ;
26
+ import android .view .GestureDetector ;
26
27
import android .view .Menu ;
27
28
import android .view .MenuItem ;
28
29
import android .view .MotionEvent ;
37
38
import java .io .IOException ;
38
39
import java .io .OutputStream ;
39
40
import java .text .SimpleDateFormat ;
41
+ import java .util .ArrayList ;
42
+ import java .util .Arrays ;
40
43
import java .util .Date ;
41
44
42
45
/**
43
46
* @author nekocode ([email protected] )
44
47
*/
45
- public class MainActivity extends AppCompatActivity {
48
+ public class MainActivity extends AppCompatActivity implements GestureDetector . OnGestureListener {
46
49
private static final int REQUEST_CAMERA_PERMISSION = 101 ;
47
50
private FrameLayout container ;
48
51
private CameraRenderer renderer ;
49
52
private TextureView textureView ;
50
53
private int filterId = R .id .filter0 ;
54
+ private int mCurrentFilterId = 0 ;
55
+
56
+ String [] TITLES = {"Original" , "EdgeDectection" , "Pixelize" ,
57
+ "EMInterference" , "TrianglesMosaic" , "Legofied" ,
58
+ "TileMosaic" , "Blueorange" , "ChromaticAberration" ,
59
+ "BasicDeform" , "Contrast" , "NoiseWarp" , "Refraction" ,
60
+ "Mapping" , "Crosshatch" , "LichtensteinEsque" ,
61
+ "AsciiArt" , "MoneyFilter" , "Cracked" , "Polygonization" ,
62
+ "JFAVoronoi" , "BlackAndWhite" };
63
+
64
+ Integer [] FILTER_RES_IDS = {R .id .filter0 , R .id .filter1 , R .id .filter2 , R .id .filter3 , R .id .filter4 ,
65
+ R .id .filter5 , R .id .filter6 , R .id .filter7 , R .id .filter8 , R .id .filter9 , R .id .filter10 ,
66
+ R .id .filter11 , R .id .filter12 , R .id .filter13 , R .id .filter14 , R .id .filter15 , R .id .filter16 ,
67
+ R .id .filter17 , R .id .filter18 , R .id .filter19 , R .id .filter20 ,
68
+ R .id .filter21 };
69
+
70
+ ArrayList <Integer > mFilterArray = new ArrayList <>(Arrays .asList (FILTER_RES_IDS ));
71
+
72
+ GestureDetector mGestureDetector ;
51
73
52
74
@ Override
53
75
protected void onCreate (Bundle savedInstanceState ) {
54
76
super .onCreate (savedInstanceState );
55
77
setContentView (container = new FrameLayout (this ));
56
- setTitle ("Original" );
78
+ setTitle (TITLES [mCurrentFilterId ]);
79
+
57
80
58
81
if (ContextCompat .checkSelfPermission (this ,
59
82
Manifest .permission .CAMERA )
@@ -71,6 +94,8 @@ protected void onCreate(Bundle savedInstanceState) {
71
94
} else {
72
95
setupCameraPreviewView ();
73
96
}
97
+
98
+ mGestureDetector = new GestureDetector (this , this );
74
99
}
75
100
76
101
@ Override
@@ -90,20 +115,11 @@ void setupCameraPreviewView() {
90
115
container .addView (textureView );
91
116
textureView .setSurfaceTextureListener (renderer );
92
117
93
- // Show original frame when touch the view
118
+ // textureView.setOnTouchListener(this);
94
119
textureView .setOnTouchListener (new View .OnTouchListener () {
95
120
@ Override
96
- public boolean onTouch (View v , MotionEvent event ) {
97
- switch (event .getAction ()) {
98
- case MotionEvent .ACTION_DOWN :
99
- renderer .setSelectedFilter (R .id .filter0 );
100
- break ;
101
-
102
- case MotionEvent .ACTION_UP :
103
- case MotionEvent .ACTION_CANCEL :
104
- renderer .setSelectedFilter (filterId );
105
- break ;
106
- }
121
+ public boolean onTouch (View view , MotionEvent motionEvent ) {
122
+ mGestureDetector .onTouchEvent (motionEvent );
107
123
return true ;
108
124
}
109
125
});
@@ -139,7 +155,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
139
155
140
156
if (renderer != null )
141
157
renderer .setSelectedFilter (filterId );
142
-
158
+ mCurrentFilterId = mFilterArray . indexOf ( filterId );
143
159
return true ;
144
160
}
145
161
@@ -178,4 +194,62 @@ private String genSaveFileName(String prefix, String suffix) {
178
194
String externalPath = Environment .getExternalStorageDirectory ().toString ();
179
195
return externalPath + "/" + prefix + timeString + suffix ;
180
196
}
197
+
198
+ @ Override
199
+ public boolean onDown (MotionEvent motionEvent ) {
200
+
201
+ return false ;
202
+ }
203
+
204
+ @ Override
205
+ public void onShowPress (MotionEvent motionEvent ) {
206
+
207
+ }
208
+
209
+ @ Override
210
+ public boolean onSingleTapUp (MotionEvent motionEvent ) {
211
+ return false ;
212
+ }
213
+
214
+ @ Override
215
+ public boolean onScroll (MotionEvent motionEvent , MotionEvent motionEvent1 , float v , float v1 ) {
216
+ return false ;
217
+ }
218
+
219
+ @ Override
220
+ public void onLongPress (MotionEvent motionEvent ) {
221
+
222
+ }
223
+
224
+ @ Override
225
+ public boolean onFling (MotionEvent e1 , MotionEvent e2 , float velocityX , float velocityY ) {
226
+ float velocity = Math .abs (velocityX ) > Math .abs (velocityY ) ? velocityX : velocityY ;
227
+ int step = velocity > 0 ? -1 : 1 ;
228
+ mCurrentFilterId = circleLoop (TITLES .length , mCurrentFilterId , step );
229
+ setTitle (TITLES [mCurrentFilterId ]);
230
+ if (renderer != null ) {
231
+ renderer .setSelectedFilter (FILTER_RES_IDS [mCurrentFilterId ]);
232
+ }
233
+ return true ;
234
+ }
235
+
236
+ private int circleLoop (int size , int currentPos , int step ) {
237
+ if (step == 0 ) {
238
+ return currentPos ;
239
+ }
240
+
241
+ if (step > 0 ) {
242
+ if (currentPos + step >= size ) {
243
+ return (currentPos + step ) % size ;
244
+ } else {
245
+ return currentPos + step ;
246
+ }
247
+ } else {
248
+ if (currentPos + step < 0 ) {
249
+ return currentPos + step + size ;
250
+ } else {
251
+ return currentPos + step ;
252
+ }
253
+ }
254
+ }
181
255
}
0 commit comments