【问题标题】:How to draw circles on different positions using onTouchEven() in android?如何在android中使用onTouchEven()在不同位置绘制圆圈?
【发布时间】:2020-04-10 09:13:43
【问题描述】:

我正在尝试在用户触摸的点绘制一个圆圈。我正在使用 onTouchEvent() 来获取触摸的 x y 坐标。以下代码在屏幕的右上角添加了一个圆圈。但是当我使用无效时() 函数之前的'break;' onTouchEvent() 中的语句,出现了圆圈,但是当我在其他位置触摸时,前一个圆圈被擦除,并且在新的触摸位置绘制了一个新圆圈。 如何修改此代码,以便在每个 ACTION_DOWN onTouchEvent() 上在该点上绘制一个圆圈,并且之前绘制的圆圈也不会被删除。

public class TestView3 extends View {

    private static final String TAG = "TestView3";
    Paint paint = new Paint();
    float mX,mY;

    public TestView3(Context context, AttributeSet attributeSet){
        super(context);
        Log.d(TAG, "TestView3: constructor called");
        paint.setColor(Color.BLACK);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw: called");
        //canvas.drawLine(0,0,20,20,paint);
        //canvas.drawLine(20,0,0,20,paint);
        canvas.drawCircle(mX,mY,10,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouchEvent: Action_down happend");
                mX = x;
                mY = y;

                break;
        }
        return true;

    }
}

【问题讨论】:

    标签: android android-studio android-canvas touch-event


    【解决方案1】:

    您必须将您的圈子存储在一个列表中,并在onDraw 方法中绘制每个圈子。

    以下编辑后的代码对我有用。

    public class TestView3 extends View {
    
        private static final String TAG = "TestView3";
        Paint paint = new Paint();
        float mX,mY;
        Bitmap mBitmap;
        Canvas mCanvas;
    
        ArrayList<Point> arrayList = new ArrayList<>();
    
        public TestView3(Context context, AttributeSet attributeSet){
            super(context);
            Log.d(TAG, "TestView3: constructor called");
            paint.setColor(Color.BLACK);
    
    
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Log.d(TAG, "onDraw: called");
            //canvas.drawLine(0,0,20,20,paint);
            //canvas.drawLine(20,0,0,20,paint);
            for(int i = 0;i < arrayList.size();i++){
                Point point = arrayList.get(i);
                canvas.drawCircle(point.x,point.y,10,paint);
    
    
                // Draw line with next point (if it exists)
                if (i + 1 < arrayList.size()) {
                    Point next = arrayList.get(i + 1);
                    canvas.drawLine(point.x, point.y, next.x, next.y, paint);
                }
            }
           // canvas.drawCircle(mX,mY,10,paint);
        }
    
    /*    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
    
            mBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
    
        }*/
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            float x = event.getX();
            float y = event.getY();
    
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    Log.d(TAG, "onTouchEvent: Action_down happend");
    
                    mX = x;
                    mY = y;
                    arrayList.add(new Point((int)x,(int)y));
                    invalidate();
                    break;
            }
            return true;
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2020-01-30
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多