質問編集履歴

1

カスタムViewのコードを追記しました。(こちらのソースは広いものです。)

2018/10/12 06:55

投稿

24develop
24develop

スコア8

test CHANGED
File without changes
test CHANGED
@@ -66,7 +66,9 @@
66
66
 
67
67
  正直自身の能力を超えていて泣きそうです。
68
68
 
69
-
69
+ というかこれってアプリ開発初心者が一人で取り組む内容なんでしょうか…。
70
+
71
+ 投げたいです。
70
72
 
71
73
 
72
74
 
@@ -116,4 +118,266 @@
116
118
 
117
119
  }
118
120
 
121
+
122
+
119
123
  ```
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+ ```
132
+
133
+ //カスタムViewクラス(抜粋)
134
+
135
+ private OnTouchListener mTouchListener = new OnTouchListener() {
136
+
137
+ @Override
138
+
139
+ public boolean onTouch(View view, MotionEvent event) {
140
+
141
+
142
+
143
+ if(view.getTag().equals("DraggableViewGroup")) {
144
+
145
+ switch (event.getAction()) {
146
+
147
+ case MotionEvent.ACTION_DOWN:
148
+
149
+ move_orgX = event.getRawX();
150
+
151
+ move_orgY = event.getRawY();
152
+
153
+ break;
154
+
155
+ case MotionEvent.ACTION_MOVE:
156
+
157
+ float offsetX = event.getRawX() - move_orgX;
158
+
159
+ float offsetY = event.getRawY() - move_orgY;
160
+
161
+ StickerView.this.setX(StickerView.this.getX()+offsetX);
162
+
163
+ StickerView.this.setY(StickerView.this.getY() + offsetY);
164
+
165
+ move_orgX = event.getRawX();
166
+
167
+ move_orgY = event.getRawY();
168
+
169
+ break;
170
+
171
+ case MotionEvent.ACTION_UP:
172
+
173
+ break;
174
+
175
+ }
176
+
177
+ }else if(view.getTag().equals("iv_scale")){
178
+
179
+ switch (event.getAction()) {
180
+
181
+ case MotionEvent.ACTION_DOWN:
182
+
183
+
184
+
185
+ this_orgX = StickerView.this.getX();
186
+
187
+ this_orgY = StickerView.this.getY();
188
+
189
+
190
+
191
+ scale_orgX = event.getRawX();
192
+
193
+ scale_orgY = event.getRawY();
194
+
195
+ scale_orgWidth = StickerView.this.getLayoutParams().width;
196
+
197
+ scale_orgHeight = StickerView.this.getLayoutParams().height;
198
+
199
+
200
+
201
+ rotate_orgX = event.getRawX();
202
+
203
+ rotate_orgY = event.getRawY();
204
+
205
+
206
+
207
+ centerX = StickerView.this.getX()+
208
+
209
+ ((View)StickerView.this.getParent()).getX()+
210
+
211
+ (float)StickerView.this.getWidth()/2;
212
+
213
+
214
+
215
+
216
+
217
+ //double statusBarHeight = Math.ceil(25 * getContext().getResources().getDisplayMetrics().density);
218
+
219
+ int result = 0;
220
+
221
+ int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
222
+
223
+ if (resourceId > 0) {
224
+
225
+ result = getResources().getDimensionPixelSize(resourceId);
226
+
227
+ }
228
+
229
+ double statusBarHeight = result;
230
+
231
+ centerY = StickerView.this.getY()+
232
+
233
+ ((View)StickerView.this.getParent()).getY()+
234
+
235
+ statusBarHeight+
236
+
237
+ (float)StickerView.this.getHeight()/2;
238
+
239
+
240
+
241
+ break;
242
+
243
+ case MotionEvent.ACTION_MOVE:
244
+
245
+
246
+
247
+ rotate_newX = event.getRawX();
248
+
249
+ rotate_newY = event.getRawY();
250
+
251
+ //回転数
252
+
253
+ double angle_diff = Math.abs(
254
+
255
+ Math.atan2(event.getRawY() - scale_orgY , event.getRawX() - scale_orgX)
256
+
257
+ - Math.atan2(scale_orgY - centerY, scale_orgX - centerX))*180/Math.PI;
258
+
259
+
260
+
261
+
262
+
263
+ double length1 = getLength(centerX, centerY, scale_orgX, scale_orgY);
264
+
265
+ double length2 = getLength(centerX, centerY, event.getRawX(), event.getRawY());
266
+
267
+
268
+
269
+ int size = convertDpToPixel(SELF_SIZE_DP, getContext());
270
+
271
+ if(length2 > length1
272
+
273
+ && (angle_diff < 25 || Math.abs(angle_diff-180)<25)
274
+
275
+ ) {
276
+
277
+ LOGD("xxxStickerViewsize", "everyrotatehascome?" );
278
+
279
+ //scale up
280
+
281
+ double offsetX = Math.abs(event.getRawX() - scale_orgX);
282
+
283
+ double offsetY = Math.abs(event.getRawY() - scale_orgY);
284
+
285
+ double offset = Math.max(offsetX, offsetY);
286
+
287
+ offset = Math.round(offset);
288
+
289
+ StickerView.this.getLayoutParams().width += offset;
290
+
291
+ StickerView.this.getLayoutParams().height += offset;
292
+
293
+ onScaling(true);
294
+
295
+ StickerView.this.setX((float) (getX() - offset / 2));
296
+
297
+ StickerView.this.setY((float) (getY() - offset / 2));
298
+
299
+
300
+
301
+ }else if(length2 < length1
302
+
303
+ && (angle_diff < 25 || Math.abs(angle_diff-180)<25)
304
+
305
+ && StickerView.this.getLayoutParams().width > size/2
306
+
307
+ && StickerView.this.getLayoutParams().height > size/2) {
308
+
309
+ //scale down
310
+
311
+ double offsetX = Math.abs(event.getRawX() - scale_orgX);
312
+
313
+ double offsetY = Math.abs(event.getRawY() - scale_orgY);
314
+
315
+ double offset = Math.max(offsetX, offsetY);
316
+
317
+ offset = Math.round(offset);
318
+
319
+ StickerView.this.getLayoutParams().width -= offset;
320
+
321
+ StickerView.this.getLayoutParams().height -= offset;
322
+
323
+ onScaling(false);
324
+
325
+ }
326
+
327
+
328
+
329
+ //rotate
330
+
331
+ double angle = Math.atan2(event.getRawY() - centerY, event.getRawX() - centerX) * 180 / Math.PI;
332
+
333
+
334
+
335
+ //setRotation((float) angle - 45);
336
+
337
+ setRotation((float) angle - 45);
338
+
339
+
340
+
341
+ onRotating();
342
+
343
+
344
+
345
+ rotate_orgX = rotate_newX;
346
+
347
+ rotate_orgY = rotate_newY;
348
+
349
+
350
+
351
+ scale_orgX = event.getRawX();
352
+
353
+ scale_orgY = event.getRawY();
354
+
355
+
356
+
357
+ postInvalidate();
358
+
359
+ requestLayout();
360
+
361
+
362
+
363
+ LOGD("xxxStickerViewsize", "view.getX()=" + StickerView.this.getX() + "view.getY()=" +StickerView.this.getY() );
364
+
365
+
366
+
367
+ break;
368
+
369
+ case MotionEvent.ACTION_UP:
370
+
371
+ break;
372
+
373
+ }
374
+
375
+ }
376
+
377
+ return true;
378
+
379
+ }
380
+
381
+ };
382
+
383
+ ```