【问题标题】:drawing to canvas on android motion events在 android 运动事件上​​绘制到画布
【发布时间】:2025-12-19 14:40:11
【问题描述】:

我是编程新手,大部分时间都是自学和使用书籍,并从其他人在此论坛上提出的问题中获得了很多帮助。 我目前正在为假人开发 android 游戏,遇到了几个问题,其中大部分我已经能够自己解决,但是我无法解决这个编译器错误。它无法识别代码中的 canvas.drawCircle。我不知道为什么。 非常感谢任何帮助或想法。 提前致谢 汤姆

public class CrazyEightsView extends View {

    private Paint redPaint;
    private int circleX;
    private int circleY;
    private float radius;

    public  CrazyEightsView(Context context) {
        super(context) ;
        redPaint = new Paint();
        redPaint.setAntiAlias(true);
        redPaint.setColor(Color.rgb(99, 00, 00));
        circleX=100;
        circleY=100;
        radius=30;      
    }

    @Override
    public void onDraw (Canvas canvas) {

    }


    public  boolean onTouchEvent (MotionEvent event) {
        int eventaction = event.getAction();
        int X =(int)event.getX();
        int Y =(int)event.getY();

        switch (eventaction){
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                circleX = X;
                circleY = Y;
                break;

                invalidate();
                return true;
        }

        canvas.drawCircle (circleX, circleY, radius, redPaint); 
    }
}

【问题讨论】:

  • 在draw方法里面移动这个canvas.drawCircle(circleX, circleY, radius, redPaint); invalidate() 将刷新平局。

标签: android canvas touch-event


【解决方案1】:

正如 Raghunandan 所说,不要尝试使用除 onDraw() 之外的任何方法进行绘制。在onTouch() 中设置XY 值,然后使视图无效。这将再次调用onDraw()

【讨论】:

  • 感谢其他有类似问题的人这是我的代码现在的样子 @Override public void onDraw (Canvas canvas) {canvas.drawCircle (circleX, circleY, radius, redPaint);无效(); }public boolean onTouchEvent (MotionEvent 事件) { int eventaction = event.getAction(); int X =(int)event.getX(); int Y =(int)event.getY(); switch (eventaction){ case MotionEvent.ACTION_DOWN: break;案例 MotionEvent.ACTION_MOVE:中断;案例 MotionEvent.ACTION_UP: circleX = X;圆Y = Y;休息;默认值:} 返回真;
【解决方案2】:

在draw方法中移动这个

      canvas.drawCircle (circleX, circleY, radius, redPaint);

要强制绘制视图,请调用 invalidate()。

http://developer.android.com/reference/android/view/View.html#invalidate()

invalidate() 将刷新绘图(调用 onDraw(canvas)。

http://developer.android.com/reference/android/graphics/Canvas.html

根据需要修改以下内容。

    public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    CrazyEightsView ev= new CrazyEightsView(this);

    setContentView(ev);
}

public class CrazyEightsView extends View {

    private Paint redPaint;
    private int circleX;
    private int circleY;
    private float radius;

    public  CrazyEightsView(Context context) {
        super(context) ;
        redPaint = new Paint();
        redPaint.setAntiAlias(true);
        redPaint.setColor(Color.rgb(99, 00, 00));
        circleX=100;
        circleY=100;
        radius=30;

    }
    @Override

    public void onDraw (Canvas canvas) {
                    // draw your circle on the canvas
        canvas.drawCircle (circleX, circleY, radius, redPaint);
    }

    public  boolean onTouchEvent (MotionEvent event) {
            int eventaction = event.getAction();
            int X =(int)event.getX();
            int Y =(int)event.getY();

            switch (eventaction){
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                circleX = X;
                circleY = Y;
                invalidate();// call invalidate to refresh the draw
                break;

            }
            return true;
    }
    }

 }

【讨论】: