도면 응용 프로그램을 만드는 중 android Canvas
클래스를 사용하고 있습니다. 이것은 Canvas 클래스로 작업하는 첫 번째 시도입니다. 지금까지 내가 사용하는 코드가 잘 작동하고 있으며 도면이 정상적으로 작동하고 있습니다. 하지만이 코드에서 깨달은 것은 사용자가 한 손가락 만 그리는 것을 허용한다는 것입니다. 즉, 사용자가 캔버스에 그려주는 손가락을 두 개 이상 사용하면 여러 손가락으로 그릴 수 없습니다. 여러 개의 터치 이벤트에 관한 여러 문서를 읽었지만 내 코드에서이를 구현하지 못했습니다. 그래서 아무도 내가 이것을 이해하도록 도울 수 있습니다.캔버스에 여러 손가락으로 그리는 방법
내가 캔버스에 그리기에 사용되는 코드는 내가 여러 터치를 지원하려면 코드에서 변경을 시도
public class DrawView extends View implements OnTouchListener
{
private Canvas m_Canvas;
private Path m_Path;
private Paint m_Paint;
ArrayList<Pair<Path, Paint>> arrayListPaths = new ArrayList<Pair<Path, Paint>>();
ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>();
private float mX, mY;
private Bitmap bitmapToCanvas;
private static final float TOUCH_TOLERANCE = 4;
public DrawView(Context context)
{
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
onCanvasInitialization();
}
public void onCanvasInitialization()
{
m_Paint = new Paint();
m_Paint.setAntiAlias(true);
m_Paint.setDither(true);
m_Paint.setColor(Color.parseColor("#37A1D1"));
m_Paint.setStyle(Paint.Style.STROKE);
m_Paint.setStrokeJoin(Paint.Join.ROUND);
m_Paint.setStrokeCap(Paint.Cap.ROUND);
m_Paint.setStrokeWidth(2);
m_Path = new Path();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
bitmapToCanvas = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
m_Canvas = new Canvas(bitmapToCanvas);
}
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawBitmap(bitmapToCanvas, 0f, 0f, null);
canvas.drawPath(m_Path, m_Paint);
}
public boolean onTouch(View arg0, MotionEvent event)
{
float x = event.getX();
float y = event.getY();
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
{
touch_move(x, y);
invalidate();
break;
}
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
private void touch_start(float x, float y)
{
undonePaths.clear();
m_Path.reset();
m_Path.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y)
{
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
{
m_Path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
private void touch_up()
{
m_Path.lineTo(mX, mY);
// commit the path to our offscreen
m_Canvas.drawPath(m_Path, m_Paint);
// kill this so we don't double draw
Paint newPaint = new Paint(m_Paint); // Clones the mPaint object
arrayListPaths.add(new Pair<Path, Paint>(m_Path, newPaint));
m_Path = new Path();
}
}
이지만, 제대로 작동하지 않습니다. 이것은 나의 변경 코드 http://pastebin.com/W6qvpYGW입니다.
사실 나는이 문서를 통해 이동,하지만 문서에 그들은 그것이 우리가 MotionEvent.ACTION_POINTER_DOWN 필요 다수의 터치를 등록, 그러나 그들의 예제 코드가 있음을 사용한 적이, 그리고 u는 U 수 괜찮다 둘째 경우 언급 내 코드에서 구현하도록 도와주세요. 사실 나는 시도했지만 작동하지 않습니다. – AndroidDev
내 제안에 따라 코드를 변경했지만 한 손가락으로도 그릴 때마다 충돌이 발생합니다. http://pastebin.com/uKwz24y5 – AndroidDev
코드에서 ACTION_DOWN은 비어 있으며 Action_down 자체에서 포인터 ID를 얻을 수 있습니다. ACTION_DOWN 터치 이벤트의 모든 코스에서 첫 번째 이벤트가되고, 그 다음에 와드에서 ACTION_POINTER_DOWN 손가락이 서로 호출됩니다. 포인터 수를 구한 다음 포인터 색인을 계산하고 ACTION_POINTER_DOWN 및 ACTION_POINTER_UP에서 관리해야합니다. 그것은 완벽하게 구현하는 데 약간의 시간이 걸릴 수 있습니다 .... –