Это мой первый раз, когда Canvas на Android. Я создаю приложение, которое будет отображать круги в определенных положениях по экрану по одному (позиции выбираются случайным образом). Новый круг следует рисовать после того, как предыдущий был выбран/затронут, а предыдущий должен исчезнуть. У меня есть некоторые идеи: сохранить аррайалист объектов Point (каждый объект содержит координату x, y центра круга) и произвольно выбирать каждый раз, когда круг рисуется на экране. Поэтому сначала я заполняю массив точек. Я также знаю, как случайным образом выбирать элемент из arraylist. Мое самое большое недоумение - как подключить методы onDraw и onTouchEvent друг к другу? Я знаю, что я должен проверить, был ли выбран круг, и только затем нарисовать новый круг в случайно выбранной позиции, но я не знаю, как сделать вызов метода onDraw() из onTouchEvent ...Нарисуйте круг в Android Canvas, когда предыдущий круг был выбран на предопределенных позициях
Не могли бы вы пожалуйста, помогите с этим вопросом? Мой код ниже:
package com.example.researcher.heatmap;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
/**
* TODO: document your custom view class.
*/
public class MyView extends View {
Paint paint;
ArrayList<Point> points = new ArrayList<>();
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
// Load attributes
paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
populateArrayList();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
canvas.drawColor(Color.WHITE);
int i=1; // should be random, will randomize later
for(Point p: points) {
p.x = points.get(i).x;
p.y = points.get(i).y;
canvas.drawCircle(p.x, p.y, 50, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int i=1;
for(Point p: points) {
Canvas canvas = new Canvas();
p.x = points.get(i).x;
p.y = points.get(i).y;
canvas.drawCircle(p.x, p.y, 50, paint);
}
postInvalidate();
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
break;
}
}
postInvalidate();
return true;
}
public void populateArrayList(){
points.clear();
points.add(new Point(120, 120));
points.add(new Point(150, 320));
points.add(new Point(280, 200));
}
}
Уважаемый Крис Хэнди, спасибо за Ваш ответ! Теперь он отлично работает! Для тех, у кого такая же проблема, как и я, я обновлю код позже, как только я получу работу –