Android 如何通过触摸聆听绘制多个圆圈?
我尝试让用户使用触摸在我的imageview上绘制多个圆圈。到目前为止,我一次只能画一幅。我知道在调用invalidate()后,我必须存储接触点并重新绘制每个圆,但还没有找到一种方法 这是我的代码,如果有人能指出我需要添加/更改的内容,或就如何实现这一点提供任何建议,我将不胜感激:Android 如何通过触摸聆听绘制多个圆圈?,android,graphics,touch,Android,Graphics,Touch,我尝试让用户使用触摸在我的imageview上绘制多个圆圈。到目前为止,我一次只能画一幅。我知道在调用invalidate()后,我必须存储接触点并重新绘制每个圆,但还没有找到一种方法 这是我的代码,如果有人能指出我需要添加/更改的内容,或就如何实现这一点提供任何建议,我将不胜感激: public class ImageView1 extends ImageView { public int x; public int y; ImageView1 img = (ImageView1) fin
public class ImageView1 extends ImageView {
public int x;
public int y;
ImageView1 img = (ImageView1) findViewById (R.id.imageView1);
public ImageView1(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
}
public boolean onTouchEvent(MotionEvent event){
x = (int) event.getX();
y = (int) event.getY();
return true;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
Paint p = new Paint();
p.setAntiAlias(true);
p.setColor(Color.RED);
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(1);
canvas.drawCircle(x, y, 20, p);
invalidate();
}
}
我通常将指针位置信息收集到
SparseArray
,指针ID作为键
private SparseArray<PointF> mPointers = new SparseArray<PointF>();
@Override
public boolean onTouchEvent(MotionEvent me) {
switch (me.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN: {
int ai = me.getActionIndex();
PointF pt = new PointF(me.getX(ai), me.getY(ai));
mPointers.put(me.getPointerId(ai), pt);
return true;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP: {
int pid = me.getPointerId(me.getActionIndex());
mPointers.remove(pid);
return true;
}
case MotionEvent.ACTION_MOVE: {
for (int i = 0; i < me.getPointerCount(); ++i) {
PointF pt = mPointers.get(me.getPointerId(i));
pt.set(me.getX(i), me.getY(i));
}
return true;
}
}
return false;
}
private SparseArray mPointers=new SparseArray();
@凌驾
公共事件(MotionEvent me){
开关(me.getActionMasked()){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:{
int ai=me.getActionIndex();
PointF pt=新的PointF(me.getX(ai),me.getY(ai));
mpoints.put(me.getPointerId(ai),pt);
返回true;
}
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:{
int pid=me.getPointerId(me.getActionIndex());
mPointers.remove(pid);
返回true;
}
case MotionEvent.ACTION\u移动:{
for(int i=0;i
然后,为了渲染单独的接触点,您可以迭代
mPointers
值。我通常将指针位置信息收集到SparseArray
中,指针ID作为键
private SparseArray<PointF> mPointers = new SparseArray<PointF>();
@Override
public boolean onTouchEvent(MotionEvent me) {
switch (me.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN: {
int ai = me.getActionIndex();
PointF pt = new PointF(me.getX(ai), me.getY(ai));
mPointers.put(me.getPointerId(ai), pt);
return true;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP: {
int pid = me.getPointerId(me.getActionIndex());
mPointers.remove(pid);
return true;
}
case MotionEvent.ACTION_MOVE: {
for (int i = 0; i < me.getPointerCount(); ++i) {
PointF pt = mPointers.get(me.getPointerId(i));
pt.set(me.getX(i), me.getY(i));
}
return true;
}
}
return false;
}
private SparseArray mPointers=new SparseArray();
@凌驾
公共事件(MotionEvent me){
开关(me.getActionMasked()){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:{
int ai=me.getActionIndex();
PointF pt=新的PointF(me.getX(ai),me.getY(ai));
mpoints.put(me.getPointerId(ai),pt);
返回true;
}
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:{
int pid=me.getPointerId(me.getActionIndex());
mPointers.remove(pid);
返回true;
}
case MotionEvent.ACTION\u移动:{
for(int i=0;i
然后,为了渲染单独的触摸点,您可以在
mPointers
值上迭代。当用户:放下手指、四处移动或抬起手指时,您希望何时绘制圆?(或全部?)我相信当用户放下手指时,你想什么时候画圆圈,当用户:放下手指、四处移动或抬起?(或全部?)我相信,当用户放下手指时,感谢您的建议,但作为新手,我对稀疏阵列不太熟悉。不过我会看看能学到什么。谢谢你的建议,但作为新手,我对稀疏数组不太熟悉。不过我会看看我能学到什么。