C'est la première fois que j'utilise Canvas dans Android. Je crée une application qui afficherait des cercles à certaines positions sur l'écran, l'un après l'autre (les positions sont sélectionnées de manière aléatoire). Un nouveau cercle devrait être dessiné après que le précédent a été sélectionné/touché, et le précédent devrait disparaître. J'ai quelques idées à ce sujet: garder une liste d'objets Point (chaque objet contient les coordonnées x, y du centre du cercle) et en sélectionner aléatoirement une à chaque fois que le cercle est dessiné sur l'écran. Donc d'abord, je suis en train de remplir un tableau de points. Je sais aussi comment sélectionner aléatoirement l'élément d'arraylist. Ma plus grande confusion est de savoir comment connecter les méthodes onDraw et onTouchEvent entre elles? Je sais que je devrais vérifier si le cercle a été sélectionné et ensuite seulement dessiner un nouveau cercle à la position choisie au hasard, mais je ne sais pas comment appeler la méthode onDraw() de l'onTouchEvent ...Dessinez un cercle dans Android Canvas lorsque le cercle précédent a été sélectionné à des positions prédéfinies
S'il vous plaît aider avec ce problème? Mon code est ci-dessous:
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));
}
}
Cher Chris Handy, merci beaucoup pour votre réponse! Cela fonctionne bien maintenant! Pour ceux qui ont le même problème que moi, je mettrai à jour le code plus tard une fois que j'aurai fait fonctionner les choses –