在触摸屏上绘制圆形

11

我正在尝试在用户触摸屏幕的位置绘制一个圆形。

public class MainActivity extends Activity implements OnTouchListener {

LinearLayout layout;
float x=0;
float y=0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_main);
    layout=(LinearLayout)findViewById(R.id.layout);
    layout.addView(new CustomView(MainActivity.this));
}

public class CustomView extends View {

    Bitmap mBitmap;
    Paint paint;
    public CustomView(Context context) {
        super(context);
        mBitmap = Bitmap.createBitmap(400, 800, Bitmap.Config.ARGB_8888);
        paint=new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.setBitmap(mBitmap);
        canvas.drawCircle(x, y, 50, paint);
        Toast.makeText(MainActivity.this, "DDD", 1).show();
    }
}

@Override
public boolean onTouch(View v, MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
    layout.invalidate();

    }
    return false;
}}
2个回答

15

我会这样做:

public class TestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new DrawingView(this));
    }

    class DrawingView extends SurfaceView {

        private final SurfaceHolder surfaceHolder;
        private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        public DrawingView(Context context) {
            super(context);
            surfaceHolder = getHolder();
            paint.setColor(Color.RED);
            paint.setStyle(Style.FILL);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                if (surfaceHolder.getSurface().isValid()) {
                    Canvas canvas = surfaceHolder.lockCanvas();
                    canvas.drawColor(Color.BLACK);
                    canvas.drawCircle(event.getX(), event.getY(), 50, paint);
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
            return false;
        }
    }
}

@chx101,抱歉我不理解你的观点,但如果你有更好的答案,请随意提供。 - sdabet
首先,我会扩展View并覆盖onDrawonTouch方法,然后返回true以表示触摸已被处理。接下来,我会从onTouch方法中调用invalidate()。这将允许您在onDraw方法中绘制其他项目,因为它也将被其他事件调用。 - TheRealChx101
@chx101 听起来是一个不错的改进,你应该发布它。虽然我不确定我的回答是否值得被踩(提醒一下,踩的意思是“这个回答没有用处”)。 - sdabet
锁定画布返回空值。 - Cyph3rCod3r
1
每次触摸屏幕时,它都会清除屏幕并添加一个新的圆。我以为它会不断添加圆形。 - Ashutosh Sagar
显示剩余3条评论

8
这是修复后的版本,让它能够正常工作:
public class MainActivity extends Activity {

LinearLayout layout;
float x = 0;
float y = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    layout=(LinearLayout)findViewById(R.id.layout);
    layout.addView(new CustomView(MainActivity.this));
}

public class CustomView extends View {

    Bitmap mBitmap;
    Paint paint;

    public CustomView(Context context) {
        super(context);
        mBitmap = Bitmap.createBitmap(400, 800, Bitmap.Config.ARGB_8888);
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(x, y, 50, paint);
    }

    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            x = event.getX();
            y = event.getY();
            invalidate();
        }
        return false;
    }
}

}

兄弟,它不起作用了...谢谢你的努力...请帮我修复我的代码。 - Code_Life
即使您尚未注册onTouchListener - Code_Life
你基本上有两个选项来处理视图上的触摸事件:要么实现一个OnTouchListener并注册它,要么覆盖onTouchEvent方法。我选择了第二个选项。 - sdabet
工作了!完美!谢谢! - Pedro Paulo Amorim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接