【问题标题】:How to draw a new circle every time the screen is touched?每次触摸屏幕时如何画一个新的圆圈?
【发布时间】:2014-04-01 16:32:07
【问题描述】:

我希望程序在屏幕被触摸时画一个圆圈,如果屏幕被触摸到另一个位置,我希望程序再次画一个圆圈,但不删除旧的!

现在我的问题是它不只是在旧圆圈之外绘制一个新圆圈。它绘制一个新圆圈并删除旧圆圈。我试图找到一个解决方案,但没有任何效果。

那么谁能帮帮我?

所以它现在可以工作了!

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;

public class SingleTouchEventView extends View {
  private Paint paint = new Paint();
  List<Point> points = new ArrayList<Point>();


  public SingleTouchEventView(Context context, AttributeSet attrs) {
    super(context, attrs);}

  protected void onDraw(Canvas canvas){
      super.onDraw(canvas);
      paint.setColor(Color.GREEN);
      for(Point p: points){
           canvas.drawCircle(p.x, p.y, 20, paint);
      }
      invalidate();
    }

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

        Point p = new Point();
         p.x = (int)event.getX();
        p.y = (int)event.getY();
        points.add(p);
        invalidate();

    case MotionEvent.ACTION_MOVE:  // a pointer was moved
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL: {
      break;
    }
    }
    invalidate();
    return true;  

}




}

【问题讨论】:

  • 您是新手,但您也可以粘贴代码..
  • 当您重绘画布时,您可能会擦除前一个圆圈。您需要为您的圈子保留一份参考列表。
  • 是的,我必须尝试如何做到这一点!:) 它现在正在工作!谢谢大家!

标签: java android geometry touch-event ondraw


【解决方案1】:

您可以通过将点列表维护为私有实例变量来实现:

private List<Point> points = new ArrayList<Point>;

然后您可以在每次发生新的触摸事件时将新点添加到此列表中:

Point p = new Point();
p.x = event.getX();
p.y = event.getY();
points.add(p);
invalidate();

现在在 onDraw() 方法中,您可以打印列表中的所有点:

paint.setColor(Color.GREEN);
for(Point point: points){
     canvas.drawCircle(point.x, point.y, 20, paint);
}
invalidate();

【讨论】:

  • 我添加了 Arraylistener 并更改了 onDraw 方法,但是我必须在哪里放置“Point p = new Point(); p.x = event.getX(); p.y = event.getY() ; points.add(p); 无效();" ?
  • 您可以在重写的 onClick() 方法下添加该代码
  • 所以我必须添加一个 onClick 方法?
  • 我想你已经有了一个方法来获取触摸事件的 X 和 Y 坐标。所以只需将此代码添加到该方法中。由于您的屏幕截图不再可用,我不记得您使用了哪种方法。
【解决方案2】:

为什么不创建一个圆对象来存储绘制圆的坐标,然后将这些对象添加到数组中。然后在您的paint方法中遍历数组从每个对象获取坐标并使用坐标绘制圆?

因此,在您的 onclick 方法中,使用从触摸获得的坐标创建一个新的圆形对象

【讨论】:

    【解决方案3】:

    我不断变化的圈子课程之一:

    public class GrowCircle {
    float x, y;int radius;
    Paint myp = new Paint();
    int colr,colg,colb;
    int redvar=1;
    int bluevar=5;
    int greenvar=2;
    int tripper=10;
    int change=2;
    Random rand = new Random();
    
    public GrowCircle(float x, float y){
        this.x=x;
        this.y=y;
        this.radius=2;
        this.colr=rand.nextInt(254)+1;
        this.colg=rand.nextInt(254)+1;
        this.colb=rand.nextInt(254)+1;
    
    }
    
    public void update(){
    
        if(tripper<=1||tripper>=15){
            change=-change;
        }
        Random col = new Random();
        myp.setColor(Color.argb(255,colr,colg,colb));
        colr+=redvar;
        colg+=greenvar;
        colb+=bluevar;
    
        if(colr<=5||colr>=250){
            redvar=-redvar;
        }
        if(colg<=5||colg>=250){
            greenvar=-greenvar;
        }
        if(colb<=5||colb>=250){
            bluevar=-bluevar;
        }
    
    }
    
    public void drawThis(Canvas canvas){
        myp.setStrokeWidth(tripper);
        myp.setStyle(Style.STROKE);
        canvas.drawCircle(x, y, radius, myp);
    }
    
    
    
    }
    

    所以玩它,让它成为你想要的,然后这样做:

    ///变量声明

     CopyOnWriteArrayList<GrowCircle> gcirc= new CopyOnWriteArrayList<GrowCircle>();
    

    //在更新方法中

    for(GrowCircle circ:gcirc){
    
                            circ.update();
    
                        }
    

    //在draw方法中

     for(GrowCircle circ:gcirc){
    
    
                            circ.drawThis(c);
                        }
    //and in onTouch
    float tx =event.getX();
    float ty = event.getY();
    
      gcirc.add(new GrowCircle(tx,ty));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多