2016-01-08 13 views
0

Это мой первый раз, когда 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)); 
    } 

} 

ответ

0

вар Класс

private int state = 0  //0 normal, 1 new circle 
private int pointPos = 0; //Which point we will be drawing 

OnDraw был перезаписью х/у всех ваших других точек

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 


    paint.setStyle(Paint.Style.STROKE); 
    canvas.drawColor(Color.WHITE); 

    if(state == 1){ 
     pointPos = random(); //between 0 and points.length 
     state = 0; 
    } 

    canvas.drawCircle(points.get(pointsPos).x, points.get(pointsPos).y, 50, paint); 

} 

onTouchEvent: Нанесение должно быть сделано только на ondraw, использовать флаги/состояния для отслеживания того, что вы должны делать при следующем обратном вызове

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 

      //Though these days this is usually done on the up event 
      //Check if the point press is within the circle 
      if(contains(event, points.get(pointPos))){ 
       state = 1; 
       postInvalidate(); 
      } 



     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_CANCEL: { 
      break; 
     } 
    } 
    postInvalidate(); 
    return true; 

} 
+0

Уважаемый Крис Хэнди, спасибо за Ваш ответ! Теперь он отлично работает! Для тех, у кого такая же проблема, как и я, я обновлю код позже, как только я получу работу –

1

Спасибо Крису за вашу помощь! Я очень ценю это.

Вот мое решение, если кто-то будет нужно для справки

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.Path; 
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; 
import java.util.Random; 

/** 
* TODO: document your custom view class. 
*/ 
public class MyView extends View { 

    Paint paint; 
    ArrayList<Point> points = new ArrayList<>(); 
    private int pointsPos = 0; //Which point we will be drawing 
    public float x; 
    public float y; 
    public int radius = 150; 



    public MyView(Context context) { 
     super(context); 
     x = this.getX(); 
     y = this.getY(); 
     init(); 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     x = this.getX(); 
     y = this.getY(); 
     init(); 
    } 

    public MyView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     x = this.getX(); 
     y = this.getY(); 
     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); 

     canvas.drawCircle(points.get(pointsPos).x, points.get(pointsPos).y, radius, paint); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_MOVE: 

      case MotionEvent.ACTION_UP: 
       //Check if the point press is within the circle 
       if(contains(event, points.get(pointsPos))){ 

        Random r = new Random(System.nanoTime()); 
        pointsPos = r.nextInt(points.size());; //between 0 and points.length 

        postInvalidate(); 
       } 


      case MotionEvent.ACTION_CANCEL: { 
       break; 
      } 
     } 
     postInvalidate(); 
     return true; 

    } 

    private boolean contains(MotionEvent event, Point point) { 
     float xTouch = event.getX(); 
     float yTouch = event.getY(); 
     if ((xTouch - point.x) * (xTouch - point.x) + (yTouch - point.y) * (yTouch - point.y) <= radius * radius) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public void populateArrayList(){ 
     points.clear(); 
     points.add(new Point(220, 1020)); 
     points.add(new Point(550, 320)); 
     points.add(new Point(780, 500)); 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^